import { list, mount, multi, patch, text, createBlock, VNode, withKey } from "../../src/blockdom";
import { makeTestFixture } from "./helpers";
//------------------------------------------------------------------------------
// Setup and helpers
//------------------------------------------------------------------------------
let fixture: HTMLElement;
beforeEach(() => {
fixture = makeTestFixture();
});
afterEach(() => {
fixture.remove();
});
function kText(str: string, key: any): VNode {
return withKey(text(str), key);
}
function n(n: number) {
return kText(String(n), n);
}
const span = createBlock("
4
4
5
5
"); patch(tree, list([1, 2, 3, 4, 5].map(kPair))); expect(fixture.innerHTML).toBe( "1
1
2
2
3
3
4
4
5
5
" ); }); test("add element in middle: 1,2,4,5 => 1,2,3,4,5", () => { const tree = list([1, 2, 4, 5].map(n)); mount(tree, fixture); expect(fixture.innerHTML).toBe("1245"); patch(tree, list([1, 2, 3, 4, 5].map(n))); expect(fixture.innerHTML).toBe("12345"); }); test("add element in middle: 1,2,4,5 => 1,2,3,4,5 (multi)", () => { const tree = list([1, 2, 4, 5].map(kPair)); mount(tree, fixture); expect(fixture.innerHTML).toBe( "1
1
2
2
4
4
5
5
" ); patch(tree, list([1, 2, 3, 4, 5].map(kPair))); expect(fixture.innerHTML).toBe( "1
1
2
2
3
3
4
4
5
5
" ); }); test("add element at beginning and end: 2,3,4 => 1,2,3,4,5", () => { const tree = list([2, 3, 4].map(n)); mount(tree, fixture); expect(fixture.innerHTML).toBe("234"); patch(tree, list([1, 2, 3, 4, 5].map(n))); expect(fixture.innerHTML).toBe("12345"); }); test("add element at beginning and end: 2,3,4 => 1,2,3,4,5 (multi)", () => { const tree = list([2, 3, 4].map(kPair)); mount(tree, fixture); expect(fixture.innerHTML).toBe("2
2
3
3
4
4
"); patch(tree, list([1, 2, 3, 4, 5].map(kPair))); expect(fixture.innerHTML).toBe( "1
1
2
2
3
3
4
4
5
5
" ); }); test("adds children: [] => [1,2,3]", () => { const tree = list([].map(n)); mount(tree, fixture); expect(fixture.innerHTML).toBe(""); patch(tree, list([1, 2, 3].map(n))); expect(fixture.innerHTML).toBe("123"); }); test("adds children: [] => [1,2,3] (multi)", () => { const tree = list([].map(kPair)); mount(tree, fixture); expect(fixture.innerHTML).toBe(""); patch(tree, list([1, 2, 3].map(kPair))); expect(fixture.innerHTML).toBe("1
1
2
2
3
3
"); }); test("adds children: [] => [1,2,3] (inside elem)", () => { const block = createBlock("123
"); }); test("adds children: [] => [1,2,3] (inside elem, multi)", () => { const block = createBlock("1
1
2
2
3
3
"); }); test("remove children: [1,2,3] => []", () => { const tree = list([1, 2, 3].map(n)); mount(tree, fixture); expect(fixture.innerHTML).toBe("123"); patch(tree, list([].map(n))); expect(fixture.innerHTML).toBe(""); }); test("remove children: [1,2,3] => [] (multi)", () => { const tree = list([1, 2, 3].map(kPair)); mount(tree, fixture); expect(fixture.innerHTML).toBe("1
1
2
2
3
3
"); patch(tree, list([].map(kPair))); expect(fixture.innerHTML).toBe(""); }); test("remove children: [1,2,3] => [] (inside elem)", () => { const block = createBlock("123
"); patch(tree, block([], [list([])])); expect(fixture.innerHTML).toBe(""); }); test("remove children from the beginning: [1,2,3,4,5] => [3,4,5]", () => { const tree = list([1, 2, 3, 4, 5].map(n)); mount(tree, fixture); expect(fixture.innerHTML).toBe("12345"); patch(tree, list([3, 4, 5].map(n))); expect(fixture.innerHTML).toBe("345"); }); test("remove children from the beginning: [1,2,3,4,5] => [3,4,5] (multi)", () => { const tree = list([1, 2, 3, 4, 5].map(kPair)); mount(tree, fixture); expect(fixture.innerHTML).toBe( "1
1
2
2
3
3
4
4
5
5
" ); patch(tree, list([3, 4, 5].map(kPair))); expect(fixture.innerHTML).toBe("3
3
4
4
5
5
"); }); test("remove children from the end: [1,2,3,4,5] => [1,2,3]", () => { const tree = list([1, 2, 3, 4, 5].map(n)); mount(tree, fixture); expect(fixture.innerHTML).toBe("12345"); patch(tree, list([1, 2, 3].map(n))); expect(fixture.innerHTML).toBe("123"); }); test("remove children from the middle: [1,2,3,4,5] => [1,2,4,5]", () => { const tree = list([1, 2, 3, 4, 5].map(n)); mount(tree, fixture); expect(fixture.innerHTML).toBe("12345"); patch(tree, list([1, 2, 4, 5].map(n))); expect(fixture.innerHTML).toBe("1245"); }); }); describe("element reordering", () => { test("move element forward: [1,2,3,4] => [2,3,1,4]", () => { const tree = list([1, 2, 3, 4].map(n)); mount(tree, fixture); expect(fixture.innerHTML).toBe("1234"); patch(tree, list([2, 3, 1, 4].map(n))); expect(fixture.innerHTML).toBe("2314"); }); test("move element forward: [1,2,3,4] => [2,3,1,4] (multi)", () => { const tree = list([1, 2, 3, 4].map(kPair)); mount(tree, fixture); expect(fixture.innerHTML).toBe( "1
1
2
2
3
3
4
4
" ); patch(tree, list([2, 3, 1, 4].map(kPair))); expect(fixture.innerHTML).toBe( "2
2
3
3
1
1
4
4
" ); }); test("move element to end: [1,2,3] => [2,3,1]", () => { const tree = list([1, 2, 3].map(n)); mount(tree, fixture); expect(fixture.innerHTML).toBe("123"); patch(tree, list([2, 3, 1].map(n))); expect(fixture.innerHTML).toBe("231"); }); test("move element to end: [1,2,3] => [2,3,1] (multi)", () => { const tree = list([1, 2, 3].map(kPair)); mount(tree, fixture); expect(fixture.innerHTML).toBe("1
1
2
2
3
3
"); patch(tree, list([2, 3, 1].map(kPair))); expect(fixture.innerHTML).toBe("2
2
3
3
1
1
"); }); test("move element backward: [1,2,3,4] => [1,4,2,3]", () => { const tree = list([1, 2, 3, 4].map(n)); mount(tree, fixture); expect(fixture.innerHTML).toBe("1234"); patch(tree, list([1, 4, 2, 3].map(n))); expect(fixture.innerHTML).toBe("1423"); }); test("swaps first and last: [1,2,3,4] => [4,3,2,1]", () => { const tree = list([1, 2, 3, 4].map(n)); mount(tree, fixture); expect(fixture.innerHTML).toBe("1234"); patch(tree, list([4, 3, 2, 1].map(n))); expect(fixture.innerHTML).toBe("4321"); }); }); describe("miscellaneous operations", () => { test("move to left and replace: [1,2,3,4,5] => [4,1,2,3,6]", () => { const tree = list([1, 2, 3, 4, 5].map(n)); mount(tree, fixture); expect(fixture.innerHTML).toBe("12345"); patch(tree, list([4, 1, 2, 3, 6].map(n))); expect(fixture.innerHTML).toBe("41236"); }); test("move to left and replace: [1,2,3,4,5] => [4,1,2,3,6] (multi)", () => { const tree = list([1, 2, 3, 4, 5].map(kPair)); mount(tree, fixture); expect(fixture.innerHTML).toBe( "1
1
2
2
3
3
4
4
5
5
" ); patch(tree, list([4, 1, 2, 3, 6].map(kPair))); expect(fixture.innerHTML).toBe( "4
4
1
1
2
2
3
3
6
6
" ); }); test("move to left and leave hole: [1,4,5] => [4,6]", () => { const tree = list([1, 4, 5].map(n)); mount(tree, fixture); expect(fixture.innerHTML).toBe("145"); patch(tree, list([4, 6].map(n))); expect(fixture.innerHTML).toBe("46"); }); test("[2,4,5] => [4,5,3]", () => { const tree = list([2, 4, 5].map(n)); mount(tree, fixture); expect(fixture.innerHTML).toBe("245"); patch(tree, list([4, 5, 3].map(n))); expect(fixture.innerHTML).toBe("453"); }); test("reverse elements [1,2,3,4,5,6,7,8] => [8,7,6,5,4,3,2,1]", () => { const tree = list([1, 2, 3, 4, 5, 6, 7, 8].map(n)); mount(tree, fixture); expect(fixture.innerHTML).toBe("12345678"); patch(tree, list([8, 7, 6, 5, 4, 3, 2, 1].map(n))); expect(fixture.innerHTML).toBe("87654321"); }); test("some permutation [0,1,2,3,4,5] => [4,3,2,1,5,0]", () => { const tree = list([0, 1, 2, 3, 4, 5].map(n)); mount(tree, fixture); expect(fixture.innerHTML).toBe("012345"); patch(tree, list([4, 3, 2, 1, 5, 0].map(n))); expect(fixture.innerHTML).toBe("432150"); }); });