···11+import { test, expect } from "vitest"
22+import { morph } from "../../src/morphlex"
33+import { dom } from "./utils"
44+55+test("whitespace is removed when target has no whitespace", () => {
66+ const from = dom(`<div><span>A</span> <span>B</span> <span>C</span></div>`)
77+ const to = dom(`<div><span>A</span><span>B</span><span>C</span></div>`)
88+99+ // Verify initial state
1010+ expect(from.childNodes.length).toBe(5) // SPAN, TEXT, SPAN, TEXT, SPAN
1111+ expect(to.childNodes.length).toBe(3) // SPAN, SPAN, SPAN
1212+1313+ morph(from, to)
1414+1515+ // After morph, from should have no whitespace like to
1616+ expect(from.childNodes.length).toBe(3)
1717+ expect(from.childNodes[0]?.nodeName).toBe("SPAN")
1818+ expect(from.childNodes[1]?.nodeName).toBe("SPAN")
1919+ expect(from.childNodes[2]?.nodeName).toBe("SPAN")
2020+})
2121+2222+test("whitespace is added when target has whitespace", () => {
2323+ const from = dom(`<div><span>A</span><span>B</span><span>C</span></div>`)
2424+ const to = dom(`<div><span>A</span> <span>B</span> <span>C</span></div>`)
2525+2626+ // Verify initial state
2727+ expect(from.childNodes.length).toBe(3) // SPAN, SPAN, SPAN
2828+ expect(to.childNodes.length).toBe(5) // SPAN, TEXT, SPAN, TEXT, SPAN
2929+3030+ morph(from, to)
3131+3232+ // After morph, from should have whitespace like to
3333+ expect(from.childNodes.length).toBe(5)
3434+ expect(from.childNodes[0]?.nodeName).toBe("SPAN")
3535+ expect(from.childNodes[1]?.nodeType).toBe(3) // TEXT_NODE
3636+ expect(from.childNodes[1]?.textContent).toBe(" ")
3737+ expect(from.childNodes[2]?.nodeName).toBe("SPAN")
3838+ expect(from.childNodes[3]?.nodeType).toBe(3) // TEXT_NODE
3939+ expect(from.childNodes[3]?.textContent).toBe(" ")
4040+ expect(from.childNodes[4]?.nodeName).toBe("SPAN")
4141+})
4242+4343+test("whitespace is reused when both have whitespace", () => {
4444+ const from = dom(`<div><span>A</span> <span>B</span> <span>C</span></div>`)
4545+ const to = dom(`<div><span>A</span> <span>B</span> <span>C</span></div>`)
4646+4747+ // Verify initial state
4848+ expect(from.childNodes.length).toBe(5)
4949+ expect(to.childNodes.length).toBe(5)
5050+5151+ // Capture the original text nodes from 'from'
5252+ const originalTextNode1 = from.childNodes[1]
5353+ const originalTextNode2 = from.childNodes[3]
5454+5555+ morph(from, to)
5656+5757+ // After morph, structure should be the same
5858+ expect(from.childNodes.length).toBe(5)
5959+ expect(from.childNodes[0]?.nodeName).toBe("SPAN")
6060+ expect(from.childNodes[1]?.nodeType).toBe(3)
6161+ expect(from.childNodes[2]?.nodeName).toBe("SPAN")
6262+ expect(from.childNodes[3]?.nodeType).toBe(3)
6363+ expect(from.childNodes[4]?.nodeName).toBe("SPAN")
6464+6565+ // The original text nodes should be reused
6666+ expect(from.childNodes[1]).toBe(originalTextNode1)
6767+ expect(from.childNodes[3]).toBe(originalTextNode2)
6868+})