1 module ut.array;
2 
3 version (unittest)  : import unit_threaded;
4 import libwasm.dom;
5 import libwasm.spa;
6 import libwasm.types;
7 import libwasm.node;
8 import libwasm.rt.array;
9 
10 @safe:
11 
12 enum Filter
13 {
14   All,
15   Checked,
16   Unchecked
17 }
18 
19 struct Item
20 {
21   mixin NodeDef!"div";
22   bool checked;
23   @prop key = 0;
24   this(bool c, int k)
25   {
26     this.checked = c;
27     this.key = k;
28   }
29 }
30 
31 struct Container
32 {
33 nothrow:
34   mixin NodeDef!"section";
35   @child UnorderedList!Item list;
36   Filter filter;
37   DynamicArray!(Item*) items;
38   auto transform(ref DynamicArray!(Item*) items, Filter filter) @trusted
39   {
40     with (Filter)
41     {
42       final switch (filter)
43       {
44       case All:
45         return items[].update(list);
46       case Checked:
47         import std.algorithm : filter;
48 
49         return items[].filter!(i => i.checked).update(list);
50       case Unchecked:
51         import std.algorithm : filter;
52 
53         return items[].filter!(i => !i.checked).update(list);
54       }
55     }
56   }
57 }
58 
59 unittest
60 {
61   renderToString!Container.should == "<section><ul></ul></section>";
62 }
63 
64 unittest
65 {
66   Container container;
67   auto node = container.renderToNode;
68   node.renderToString().should == "<section><ul></ul></section>";
69   container.items.put(new Item(true, 1));
70   container.update!(container.items);
71   node.renderToString().should == "<section><ul><div key=1></div></ul></section>";
72   container.update.filter = Filter.Unchecked;
73   node.renderToString().should == "<section><ul></ul></section>";
74 }
75 
76 unittest
77 {
78   Container container;
79   auto node = container.renderToNode;
80   foreach (i; 1 .. 3)
81     container.items.put(new Item(true, i));
82   foreach (i; 3 .. 6)
83     container.items.put(new Item(false, i));
84   foreach (i; 6 .. 9)
85     container.items.put(new Item(true, i));
86   container.update!(container.items);
87   node.renderToString().should == "<section><ul><div key=1></div><div key=2></div><div key=3></div><div key=4></div><div key=5></div><div key=6></div><div key=7></div><div key=8></div></ul></section>";
88   container.update.filter = Filter.Checked;
89   node.renderToString().should == "<section><ul><div key=1></div><div key=2></div><div key=6></div><div key=7></div><div key=8></div></ul></section>";
90   container.update.filter = Filter.Unchecked;
91   node.renderToString()
92     .should == "<section><ul><div key=3></div><div key=4></div><div key=5></div></ul></section>";
93   container.update.filter = Filter.All;
94   node.renderToString().should == "<section><ul><div key=1></div><div key=2></div><div key=3></div><div key=4></div><div key=5></div><div key=6></div><div key=7></div><div key=8></div></ul></section>";
95   container.update.filter = Filter.Unchecked;
96   node.renderToString()
97     .should == "<section><ul><div key=3></div><div key=4></div><div key=5></div></ul></section>";
98   container.update.filter = Filter.Checked;
99   node.renderToString().should == "<section><ul><div key=1></div><div key=2></div><div key=6></div><div key=7></div><div key=8></div></ul></section>";
100   container.update.filter = Filter.All;
101   node.renderToString().should == "<section><ul><div key=1></div><div key=2></div><div key=3></div><div key=4></div><div key=5></div><div key=6></div><div key=7></div><div key=8></div></ul></section>";
102 }