diff_test.gleam
1 import gleam/string 2 import gleeunit/should 3 import lightspeed/diff 4 5 pub fn patch_operation_test() { 6 diff.Replace(target: "#app", html: "<main></main>") 7 |> diff.operation 8 |> should.equal("replace") 9 } 10 11 pub fn remove_does_not_carry_html_test() { 12 diff.Remove(target: "#modal") 13 |> diff.carries_html 14 |> should.equal(False) 15 } 16 17 pub fn replace_segments_round_trip_test() { 18 let patch = 19 diff.ReplaceSegments( 20 target: "#app", 21 fingerprint: "counter/v1", 22 static_html: "<button><span data-ls-slot=\"counter\"></span></button>", 23 dynamic_slots: [ 24 diff.slot("counter", "1"), 25 ], 26 ) 27 28 patch 29 |> diff.encode 30 |> diff.decode 31 |> should.equal(Ok(patch)) 32 } 33 34 pub fn keyed_patch_plan_test() { 35 let previous = [ 36 diff.keyed_node("a", "<li data-ls-key=\"a\">A</li>"), 37 diff.keyed_node("b", "<li data-ls-key=\"b\">B</li>"), 38 ] 39 let current = [ 40 diff.keyed_node("b", "<li data-ls-key=\"b\">B2</li>"), 41 diff.keyed_node("c", "<li data-ls-key=\"c\">C</li>"), 42 ] 43 44 diff.keyed_patch_plan("#list", previous, current) 45 |> should.equal([ 46 diff.UpsertKeyed( 47 target: "#list", 48 key: "b", 49 html: "<li data-ls-key=\"b\">B2</li>", 50 ), 51 diff.UpsertKeyed( 52 target: "#list", 53 key: "c", 54 html: "<li data-ls-key=\"c\">C</li>", 55 ), 56 diff.RemoveKeyed(target: "#list", key: "a"), 57 ]) 58 } 59 60 pub fn stream_round_trip_multiple_operations_test() { 61 let patches = [ 62 diff.ReplaceSegments( 63 target: "#app", 64 fingerprint: "counter/v1", 65 static_html: "<button><span data-ls-slot=\"counter\"></span></button>", 66 dynamic_slots: [ 67 diff.slot("counter", "5"), 68 ], 69 ), 70 diff.UpdateSegments( 71 target: "#app", 72 fingerprint: "counter/v1", 73 dynamic_slots: [ 74 diff.slot("counter", "6"), 75 ], 76 ), 77 diff.UpsertKeyed( 78 target: "#events", 79 key: "evt-1", 80 html: "<li data-ls-key=\"evt-1\">increment</li>", 81 ), 82 diff.RemoveKeyed(target: "#events", key: "evt-0"), 83 ] 84 85 patches 86 |> diff.encode_stream 87 |> diff.decode_stream 88 |> should.equal(Ok(patches)) 89 } 90 91 pub fn segment_update_payload_is_smaller_than_full_fragment_replace_test() { 92 let naive_full_replace = 93 diff.Replace( 94 target: "#app", 95 html: "<button data-ls-key=\"counter-button\"><span data-ls-slot=\"counter\">42</span></button>", 96 ) 97 |> diff.encode 98 99 let segment_update = 100 diff.UpdateSegments( 101 target: "#app", 102 fingerprint: "counter-view/v1", 103 dynamic_slots: [ 104 diff.slot("counter", "43"), 105 ], 106 ) 107 |> diff.encode 108 109 should.equal( 110 string.length(segment_update) < string.length(naive_full_replace), 111 True, 112 ) 113 }