let style = import ../nixite/style.nix; html = import ../nixite/html.nix; it = import ./it.nix; in [ (it "makes a p component" (let my = (style.styled "para" "p" { style = { some-style = "some value"; }; }); in { expected = html.tag "p" { class = [ "para" ]; } "yes"; actual = my.para { } "yes"; asString = true; })) (it "extends existing components" (let my = (style.styled "generic" "p" { foo = "bar"; forgetme = "nothing"; }); this = (style.styled "quote" my.generic { baz = "baz"; forgetme = "forgotten"; }); in { expected = html.tag "p" { forgetme = "forgotten"; baz = "baz"; foo = "bar"; class = [ "generic" "quote" ]; } "yes"; actual = this.quote { } "yes"; asString = true; })) (it "makes a component with no class" (let my = (style.styled "classless" "div" { class = [ ]; }); in { expected = html.tag "div" { class = [ ]; } "yes"; actual = my.classless { } "yes"; asString = true; })) (it "does not error without attrs" (let my = (style.styled "div" "div" { class = [ "something" ]; style = { this = "that"; }; }); in{ expected = html.tag "div" { class = [ "div" "something" ]; } "yes"; actual = my.div "yes"; asString = true; })) (it "makes a component" (let my = (style.styled "div" "div" { class = [ "something" ]; style = { this = "that"; }; }); in{ expected = html.tag "div" { class = [ "div" "something" ]; } "foobar"; actual = my.div { } "foobar"; asString = true; })) (it "makes special components" (let my = (style.styled "s" "div" { id = "s"; class = [ "something" ]; style = { s = "yes"; }; }); in{ expected = html.tag "div" { id = "s"; class = [ "s" "something" ]; } "foobar"; actual = my.s { } "foobar"; asString = true; })) (it "works on many classes" (let my = (style.styled "foobar" "div" { class = [ "foo" "bar" ]; style = { something = "something"; }; }); in{ expected = html.tag "div" { class = [ "foobar" "foo" "bar" ]; } "foobar"; actual = my.foobar { } "foobar"; asString = true; })) (it "does custom behavour" (let my = (style.styled "list" "ul" { __child = child: assert builtins.isList child; (map (html.tag "li" { }) child); }); in { expected = html.tag "ul" { __ = ""; class = [ "list" ]; } [ (html.tag "li" { } "1") (html.tag "li" { } "2") ]; actual = my.list { } [ "1" "2" ]; asString = true; })) (it "combines attrs" (let my = (style.styled "div" "div" { class = [ "something" ]; style = { this = "that"; }; }) (style.styled "s" "div" { id = "s"; class = [ "something" ]; style = { s = "yes"; }; }) (style.styled "foobar" "div" { class = [ "foo" "bar" ]; style = { something = "something"; }; }) (style.style "body" { foo = "bar"; }) (style.styled "list" "ul" { __child = child: assert builtins.isList child; (map (html.tag "li" { }) child); }); in { expected = html.tag "div" { id = "foo"; class = [ "div" "something" ]; } "foobar"; actual = my.div { id = "foo"; } "foobar"; asString = true; })) (it "makes a style" (let my = (style.styled "para" "p" { style = { foo = "bar"; }; }); in { expected = { "p.para" = { foo = "bar"; }; }; actual = removeAttrs my.style [ "__toString" ]; })) (it "retains tag" (let p = (style.styled "para" "p" { style = { foo = "bar"; }; }); in { expected = "p"; actual = p.para.tag; })) (it "retains attrs" (let p = (style.styled "para" "p" { style = { foo = "bar"; }; }); in { expected = { foo = "bar"; }; actual = p.para.attrs.style; })) (it "retains class" (let p = (style.styled "para" "p" { }); in { expected = [ "para" ]; actual = p.para.attrs.class; })) (it "merges styles" (let p = (style.styled "para" "p" { style = { foo = "bar"; }; }); d = (style.styled "para2" p.para { style = { baz = "bar"; }; }); my = p d; in { expected = { "p.para" = { foo = "bar"; }; "p.para2.para" = { foo = "bar"; baz = "bar"; }; }; actual = removeAttrs my.style [ "__toString" ]; })) (it "fetches empty style" (let para = (style.tag "p" "para" {}); in { expected = {"p.para" = {};}; actual = style.getStyle ( para "" ); })) (it "fetches style" (let attrs = { style = { foo = "bar"; }; }; para = (style.tag "p" "para" attrs); in { expected = {"p.para" = attrs.style;}; actual = style.getStyle ( para "" ); })) (it "fetches style for class" (let s = { foo = "bar"; }; para = (style.tag "p" "para" {style = s;}); in { expected = {"p.para" = s;}; actual = style.getStyle ( para "" ); })) (it "fetches style recursively" (let s = { "p.para" = { foo = "bar"; }; "a.link" = { this = "that"; }; }; para = (style.tag "p" "para" {style = s."p.para";}); a = (style.tag "a" "link" {style = s."a.link";}); in { expected = s; actual = style.getStyles ( para (a "hello") ); })) (it "fetches style recursively through lists" (let s = { "p.para" = { foo = "bar"; }; "a.link" = { this = "that"; }; }; para = (style.tag "p" "para" {style = s."p.para";}); a = (style.tag "a" "link" {style = s."a.link";}); in { expected = s; actual = style.getStyles ( para [(a "hello")] ); })) (it "fetches style recursively with repeats" (let s = { "p.para" = { foo = "bar"; }; "a.link" = { this = "that"; }; }; para = (style.tag "p" "para" {style = s."p.para";}); a = (style.tag "a" "link" {style = s."a.link";}); in { expected = s; actual = style.getStyles ( para [(a "hello") (a "hello")] ); })) (it "converts styles to string" (let s = { "p.para" = { foo = "bar"; }; "a.link" = { this = "that"; }; }; in { expected = '' a.link { this: that; } p.para { foo: bar; } ''; actual = style.stylesToString s; })) ]