/ test / lightspeed / diff_test.gleam
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  }