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 }