@@ -10,7 +10,6 @@ module Testable.Element exposing
16 , expectRoundedEquality
15 , expectRoundedEquality
@@ -20,14 +19,8 @@ module Testable.Element exposing
21 , isVisible
20 , isVisible
@@ -35,17 +28,11 @@ module Testable.Element exposing
35 , paddingXY
28 , paddingXY
36 , paragraph
29 , paragraph
47 , textColumn
35 , textColumn
49 , transparent
36 , transparent
@@ -64,21 +51,9 @@ In order to run the test:
65import Dict
52import Dict
66import Element
53import Element
67import Html.Attributes
55import Html.Attributes
68import Testable
56import Testable
69−import Testable.Runner
72−{-| This is used when we want to run all tests in a test suite instead of one at a time.
74−toProgram : Testable.Runner.Testable -> Testable.Runner.TestableProgram
76− Testable.Runner.program [ testable ]
79−layout : List (Testable.Attr msg) -> Testable.Element Testable.Runner.Msg -> Testable.Runner.Testable
81− Testable.Runner.testable "Test" elem
84text : String -> Testable.Element msg
59text : String -> Testable.Element msg
@@ -87,18 +62,18 @@ text =
89el : List (Testable.Attr msg) -> Testable.Element msg -> Testable.Element msg
64el : List (Testable.Attr msg) -> Testable.Element msg -> Testable.Element msg
91− Testable.El (implicitWidthHeightShrink attrs)
66+ Testable.El
94row : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
69row : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
96− Testable.Row (implicitWidthHeightShrink attrs)
71+ Testable.Row
99column : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
74column : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
100−column attrs =
75+column =
101− Testable.Column (implicitWidthHeightShrink attrs)
76+ Testable.Column
104none : Testable.Element msg
79none : Testable.Element msg
@@ -107,82 +82,13 @@ none =
109paragraph : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
84paragraph : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
110−paragraph attrs =
85+paragraph =
113− implicitTest (widthHelper Nothing Nothing (Fill 1))
114− :: implicitTest (heightHelper Nothing Nothing Shrink)
117− Testable.Paragraph (skipOverridden withImplicits)
86+ Testable.Paragraph
120textColumn : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
89textColumn : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
121−textColumn attrs =
90+textColumn =
124− implicitTest (widthHelper (Just 500) (Just 750) (Fill 1))
125− :: implicitTest (heightHelper Nothing Nothing Shrink)
128− Testable.TextColumn (skipOverridden withImplicits)
91+ Testable.TextColumn
132− List (Testable.Attr msg)
135− , label : Testable.Element msg
137− -> Testable.Element msg
139− Testable.Link details.url
140− (implicitWidthHeightShrink attrs)
145− Testable.Attr Element.clip
149−scrollbars : Testable.Attr msg
151− Testable.Attr Element.scrollbars
155−scrollbarY : Testable.Attr msg
157− Testable.Attr Element.scrollbarY
161−scrollbarX : Testable.Attr msg
163− Testable.Attr Element.scrollbarX
166−{-| Old labeling mechanism that i removed to hastily
173− Testable.Attr (Element.moveUp x)
177− Testable.Attr (Element.moveDown x)
181− Testable.Attr (Element.moveRight x)
185− Testable.Attr (Element.moveLeft x)
188type Length
94type Length
@@ -201,14 +107,6 @@ maximum =
212px : Int -> Length
110px : Int -> Length
@@ -229,6 +127,11 @@ fillPortion =
130+label : String -> Testable.Attr msg
232transparent : Bool -> Testable.Attr msg
135transparent : Bool -> Testable.Attr msg
233transparent on =
136transparent on =
234 Testable.LabeledTest
137 Testable.LabeledTest
@@ -239,9 +142,8 @@ transparent on =
241 , attr = Element.transparent on
144 , attr = Element.transparent on
242− , id = Testable.NoId
244− \context ->
146+ \context _ ->
246 selfTransparency =
148 selfTransparency =
247 context.self.style
149 context.self.style
@@ -255,19 +157,19 @@ transparent on =
258− [ Testable.equal value selfTransparency ]
160+ Expect.equal value selfTransparency
263isVisible : Testable.Attr msg
165isVisible : Testable.Attr msg
264isVisible =
166isVisible =
265− Testable.AttrTest
167+ Testable.LabeledTest
266 { label = "is-visible"
168 { label = "is-visible"
267− , id = Testable.NoId
169+ , attr = Element.htmlAttribute (Html.Attributes.style "not" "applicable")
269− \context ->
171+ \context _ ->
270− [ Testable.equal context.self.isVisible True ]
172+ Expect.equal context.self.isVisible True
@@ -277,16 +179,15 @@ alpha a =
277 Testable.LabeledTest
179 Testable.LabeledTest
278 { label = "alpha-" ++ String.fromFloat a
180 { label = "alpha-" ++ String.fromFloat a
279 , attr = Element.alpha a
181 , attr = Element.alpha a
280− , id = Testable.NoId
282− \context ->
183+ \context _ ->
284 selfTransparency =
185 selfTransparency =
285 context.self.style
186 context.self.style
286 |> Dict.get "opacity"
187 |> Dict.get "opacity"
287 |> Maybe.withDefault "notfound"
188 |> Maybe.withDefault "notfound"
289− [ Testable.equal (String.fromFloat a) selfTransparency ]
190+ Expect.equal (String.fromFloat a) selfTransparency
@@ -296,10 +197,9 @@ padding pad =
296 Testable.LabeledTest
197 Testable.LabeledTest
297 { label = "padding " ++ String.fromInt pad
198 { label = "padding " ++ String.fromInt pad
298 , attr = Element.padding pad
199 , attr = Element.padding pad
299− , id = Testable.NoId
301− \found ->
201+ \found _ ->
302− [ Testable.true ("Padding " ++ String.fromInt pad ++ " is present")
202+ Expect.true ("Padding " ++ String.fromInt pad ++ " is present")
303 (List.all ((==) pad)
203 (List.all ((==) pad)
304 [ floor found.self.bbox.padding.left
204 [ floor found.self.bbox.padding.left
305 , floor found.self.bbox.padding.right
205 , floor found.self.bbox.padding.right
@@ -307,7 +207,6 @@ padding pad =
307 , floor found.self.bbox.padding.bottom
207 , floor found.self.bbox.padding.bottom
@@ -317,10 +216,9 @@ paddingXY x y =
317 Testable.LabeledTest
216 Testable.LabeledTest
318 { label = "paddingXY " ++ String.fromInt x ++ ", " ++ String.fromInt y
217 { label = "paddingXY " ++ String.fromInt x ++ ", " ++ String.fromInt y
319 , attr = Element.paddingXY x y
218 , attr = Element.paddingXY x y
320− , id = Testable.NoId
322− \found ->
220+ \found _ ->
323− [ Testable.true ("PaddingXY (" ++ String.fromInt x ++ ", " ++ String.fromInt y ++ ") is present")
221+ Expect.true ("PaddingXY (" ++ String.fromInt x ++ ", " ++ String.fromInt y ++ ") is present")
324 (List.all ((==) x)
222 (List.all ((==) x)
325 [ floor found.self.bbox.padding.left
223 [ floor found.self.bbox.padding.left
326 , floor found.self.bbox.padding.right
224 , floor found.self.bbox.padding.right
@@ -330,15 +228,9 @@ paddingXY x y =
330 , floor found.self.bbox.padding.bottom
228 , floor found.self.bbox.padding.bottom
338− List.filter Tuple.first ls
339− |> List.map Tuple.second
342widthHelper maybeMin maybeMax len =
234widthHelper maybeMin maybeMax len =
344 addMin l =
236 addMin l =
@@ -398,7 +290,6 @@ widthHelper maybeMin maybeMax len =
398 -- Pixel values should ignore min and max?
290 -- Pixel values should ignore min and max?
399 Testable.LabeledTest
291 Testable.LabeledTest
400 { label = "width " ++ String.fromInt val ++ "px" ++ minLabel ++ maxLabel
292 { label = "width " ++ String.fromInt val ++ "px" ++ minLabel ++ maxLabel
401− , id = Testable.IsWidth
403 Element.width
294 Element.width
404 (Element.px val
295 (Element.px val
@@ -406,24 +297,18 @@ widthHelper maybeMin maybeMax len =
406 |> addMax
297 |> addMax
409− \found ->
300+ \found _ ->
410− [ expectRoundedEquality
301+ Expect.all
411− { expected = toFloat val
302+ [ \_ ->
412− , found = found.self.bbox.width
303+ Expect.true "exact width is exact" (floor found.self.bbox.width == val)
414− , Testable.true "min/max is upheld" (minMaxTest (floor found.self.bbox.width))
304+ , \_ -> Expect.true "min/max is upheld" (minMaxTest (floor found.self.bbox.width))
418 Fill portion ->
309 Fill portion ->
419 Testable.LabeledTest
310 Testable.LabeledTest
421− if portion == 1 then
422− "width fill" ++ minLabel ++ maxLabel
425− "width fill-" ++ String.fromInt portion ++ minLabel ++ maxLabel
311+ { label = "width fill-" ++ String.fromInt portion ++ minLabel ++ maxLabel
426− , id = Testable.IsWidth
428 Element.width
313 Element.width
429 (Element.fillPortion portion
314 (Element.fillPortion portion
@@ -431,102 +316,41 @@ widthHelper maybeMin maybeMax len =
431 |> addMax
316 |> addMax
434− \context ->
319+ \context _ ->
435− if List.member context.parentLayout [ Testable.IsNearby Testable.OnRight, Testable.IsNearby Testable.OnLeft ] then
320+ if List.member context.location [ Testable.IsNearby Testable.OnRight, Testable.IsNearby Testable.OnLeft ] then
436− [ Testable.true "width fill doesn't apply to onright/onleft elements" True ]
321+ Expect.true "width fill doesn't apply to onright/onleft elements" True
440 parentAvailableWidth =
325 parentAvailableWidth =
441 context.parent.bbox.width - (context.self.bbox.padding.left + context.self.bbox.padding.right)
326 context.parent.bbox.width - (context.self.bbox.padding.left + context.self.bbox.padding.right)
444− [ case context.parentLayout of
328+ case context.location of
445− Testable.IsNearby _ ->
329+ Testable.IsNearby _ ->
446− [ Testable.true "Nearby Element has fill width"
330+ Expect.true "Nearby Element has fill width"
447− ((floor context.parent.bbox.width == floor context.self.bbox.width)
331+ ((floor context.parent.bbox.width == floor context.self.bbox.width)
448− || minMaxTest (floor context.self.bbox.width)
332+ || minMaxTest (floor context.self.bbox.width)
452− Testable.InColumn ->
335+ Testable.InColumn ->
453− [ Testable.true "Element within column has fill width"
336+ Expect.true "Element within column has fill width"
454− ((floor parentAvailableWidth == floor context.self.bbox.width)
337+ ((floor parentAvailableWidth == floor context.self.bbox.width)
455− || minMaxTest (floor context.self.bbox.width)
338+ || minMaxTest (floor context.self.bbox.width)
459− Testable.InEl ->
341+ Testable.InEl ->
460− [ Testable.true "Element within element has fill width" <|
342+ Expect.true "Element within element has fill width" <|
461− (floor parentAvailableWidth == floor context.self.bbox.width)
343+ (floor parentAvailableWidth == floor context.self.bbox.width)
462− || minMaxTest (floor context.self.bbox.width)
344+ || minMaxTest (floor context.self.bbox.width)
467− spacePerPortion =
348+ spacePerPortion =
468− parentAvailableWidth / toFloat (List.length context.siblings + 1)
349+ parentAvailableWidth / toFloat (List.length context.siblings + 1)
470− [ Testable.true "element has fill width" <|
351+ Expect.true "element has fill width" <|
471− (floor spacePerPortion == floor context.self.bbox.width)
352+ (floor spacePerPortion == floor context.self.bbox.width)
472− || minMaxTest (floor context.self.bbox.width)
353+ || minMaxTest (floor context.self.bbox.width)
474− , [ Testable.lessThanOrEqual "not larger than parent"
475− context.self.bbox.width
476− context.parent.bbox.width
478− , case context.selfElement of
479− Testable.Paragraph _ _ ->
480− -- A paragraph with width fill
481− -- we want to test for correct text wrapping here.
489− |> List.map childWidth
490− |> List.append (List.map .width context.self.textMetrics)
494− context.self.bbox.padding.left + context.self.bbox.padding.right
496− totalCalculatedWidth =
497− totalChildren + horizontalPadding
500− if boxChildrenHeight > 20 then
501− ceiling (boxChildrenHeight / 20)
504− ceiling (totalCalculatedWidth / context.self.bbox.width)
514− [ Testable.true "text wrapping, checking height"
515− -- all we're doing here is testing if wrapping is occurring
516− -- not the exact height, which is a little tricky to calculate perfectly without more information.
517− (if expectedLines > 1 then
518− context.self.bbox.height >= (20 * 2)
521− -- then it's less than 2 ~ line heights
522− -- there's some weird variance here which makes it hard to be exact.
523− context.self.bbox.height < (20 * 2)
532 Shrink ->
356 Shrink ->
@@ -538,211 +362,33 @@ widthHelper maybeMin maybeMax len =
538 |> addMin
362 |> addMin
539 |> addMax
363 |> addMax
541− , id = Testable.IsWidth
543− \context ->
366+ \context _ ->
544− case context.selfElement of
552− |> List.map childWidth
553− |> List.append (List.map .width context.self.textMetrics)
557− context.self.bbox.padding.left + context.self.bbox.padding.right
560− [ ( (context.parentLayout /= Testable.InParagraph)
561− && (context.parentLayout /= Testable.InTextCol)
562− , Testable.rounded "equals children"
563− { expected = totalChildren + horizontalPadding
564− , found = context.self.bbox.width
567− , ( context.parentLayout /= Testable.AtRoot
568− , Testable.lessThanOrEqual "not larger than parent"
569− context.self.bbox.width
570− context.parent.bbox.width
574− Testable.Link _ _ _ ->
576− childWidth child =
368+ childWidth child =
577− child.bbox.width
369+ -- TODO: add margin values to widths
581− |> List.map childWidth
582− |> List.append (List.map .width context.self.textMetrics)
586− context.self.bbox.padding.left + context.self.bbox.padding.right
589− [ ( (context.parentLayout /= Testable.InParagraph)
590− && (context.parentLayout /= Testable.InTextCol)
591− , Testable.rounded "equals children"
592− { expected = totalChildren + horizontalPadding
593− , found = context.self.bbox.width
596− , ( context.parentLayout /= Testable.AtRoot
597− , Testable.lessThanOrEqual "not larger than parent"
598− context.self.bbox.width
599− context.parent.bbox.width
603− Testable.Row rowAttrs _ ->
604− -- width of row is the sum of all children widths
605− -- both text elements and others.
608− child.bbox.width
370+ child.bbox.width
610− totalChildren =
372+ totalChildren =
611− context.children
373+ context.children
612− |> List.map childWidth
374+ |> List.map childWidth
613− |> List.append (List.map .width context.self.textMetrics)
614− |> List.sum
375+ |> List.sum
616− horizontalPadding =
377+ horizontalPadding =
617− context.self.bbox.padding.left + context.self.bbox.padding.right
378+ context.self.bbox.padding.left + context.self.bbox.padding.right
619− spacingAmount =
380+ spacingValue =
620− Testable.getSpacingFromAttributes rowAttrs
623− toFloat spacingAmount * (toFloat (List.length context.children) - 1)
381+ toFloat context.parentSpacing * (toFloat (List.length context.children) - 1)
625− listIf
383+ if totalChildren == 0 then
626− [ ( True
384+ -- TODO: The issue is that we have a hard time measuring `text` elements
385+ -- So if a element has a text child, then it's width isn't going to show up in the system.
627− , expectRoundedEquality
386+ expectRoundedEquality context.self.bbox.width context.self.bbox.width
628− { expected = totalChildren + horizontalPadding + totalSpacing
629− , found = context.self.bbox.width
632− , ( context.parentLayout /= Testable.AtRoot
633− , Testable.lessThanOrEqual "not larger than parent"
634− context.self.bbox.width
635− context.parent.bbox.width
639− Testable.Column _ _ ->
388+ else
640− -- The width of the column is the width of the widest child.
389+ -- This fails if this element is actually a column
641− let
390+ -- So we need to capture what this element is in order to do this calculation.
644− + context.self.bbox.padding.left
645− + context.self.bbox.padding.right
651− + context.self.bbox.padding.left
652− + context.self.bbox.padding.right
654− context.self.textMetrics
658− |> List.map childWidth
659− |> List.append textChildren
663− , expectRoundedEquality
664− { expected = Maybe.withDefault 0 (List.maximum allChildren)
665− , found = context.self.bbox.width
668− , ( context.parentLayout /= Testable.AtRoot
669− , Testable.lessThanOrEqual "not larger than parent"
670− context.self.bbox.width
671− context.parent.bbox.width
675− Testable.TextColumn _ _ ->
676− -- The width of the column is the width of the widest child.
680− + context.self.bbox.padding.left
681− + context.self.bbox.padding.right
687− + context.self.bbox.padding.left
688− + context.self.bbox.padding.right
690− context.self.textMetrics
694− |> List.map childWidth
695− |> List.append textChildren
699− , expectRoundedEquality
700− { expected = Maybe.withDefault 0 (List.maximum allChildren)
701− , found = context.self.bbox.width
704− , ( context.parentLayout /= Testable.AtRoot
705− , Testable.lessThanOrEqual "not larger than parent"
706− context.self.bbox.width
707− context.parent.bbox.width
711− Testable.Paragraph _ _ ->
712− -- This should be the size it's text,
713− -- unless it takes up all available space, in which case it should wrap.
720− |> List.map childWidth
721− |> List.append (List.map .width context.self.textMetrics)
725− context.self.bbox.padding.left + context.self.bbox.padding.right
729− , expectRoundedEquality
730− { expected = totalChildren + horizontalPadding
391+ expectRoundedEquality (totalChildren + horizontalPadding + spacingValue) context.self.bbox.width
731− , found = context.self.bbox.width
734− , ( context.parentLayout /= Testable.AtRoot
735− , Testable.lessThanOrEqual "not larger than parent"
736− context.self.bbox.width
737− context.parent.bbox.width
@@ -811,16 +457,17 @@ heightHelper maybeMin maybeMax len =
811 |> addMin
457 |> addMin
812 |> addMax
458 |> addMax
814− , id = Testable.IsHeight
816− \found ->
461+ \found _ ->
817− [ expectRoundedEquality
462+ Expect.all
818− { expected = toFloat val
463+ [ \_ ->
464+ Expect.true ("exact height is exact: " ++ String.fromInt (floor found.self.bbox.height) ++ "," ++ String.fromInt val)
819− , found = found.self.bbox.height
465+ (floor found.self.bbox.height == val)
821− , Testable.true "min/max holds true"
467+ Expect.true "min/max holds true"
822− (minMaxTest (floor found.self.bbox.height))
468+ (minMaxTest (floor found.self.bbox.height))
826 Fill portion ->
473 Fill portion ->
@@ -832,32 +479,31 @@ heightHelper maybeMin maybeMax len =
832 |> addMin
479 |> addMin
833 |> addMax
480 |> addMax
835− , id = Testable.IsHeight
837− \context ->
483+ \context _ ->
838− [ if List.member context.parentLayout [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
484+ if List.member context.location [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
839− Testable.true "height fill doesn't apply to above/below elements" True
485+ Expect.true "height fill doesn't apply to above/below elements" True
843 parentAvailableHeight =
489 parentAvailableHeight =
844 context.parent.bbox.height - (context.self.bbox.padding.top + context.self.bbox.padding.bottom)
490 context.parent.bbox.height - (context.self.bbox.padding.top + context.self.bbox.padding.bottom)
846− case context.parentLayout of
492+ case context.location of
847 Testable.IsNearby _ ->
493 Testable.IsNearby _ ->
848− Testable.true "Nearby Element has fill height"
494+ Expect.true "Nearby Element has fill height"
849 ((floor context.parent.bbox.height == floor context.self.bbox.height)
495 ((floor context.parent.bbox.height == floor context.self.bbox.height)
850 || minMaxTest (floor context.self.bbox.height)
496 || minMaxTest (floor context.self.bbox.height)
853 Testable.InColumn ->
499 Testable.InColumn ->
854− Testable.true "Element within column has fill height"
500+ Expect.true "Element within column has fill height"
855 ((floor parentAvailableHeight == floor context.self.bbox.height)
501 ((floor parentAvailableHeight == floor context.self.bbox.height)
856 || minMaxTest (floor context.self.bbox.height)
502 || minMaxTest (floor context.self.bbox.height)
859 Testable.InEl ->
505 Testable.InEl ->
860− Testable.true "Element within el has fill height" <|
506+ Expect.true "Element within el has fill height" <|
861 (floor parentAvailableHeight == floor context.self.bbox.height)
507 (floor parentAvailableHeight == floor context.self.bbox.height)
862 || minMaxTest (floor context.self.bbox.height)
508 || minMaxTest (floor context.self.bbox.height)
@@ -866,10 +512,9 @@ heightHelper maybeMin maybeMax len =
866 spacePerPortion =
512 spacePerPortion =
867 parentAvailableHeight / toFloat (List.length context.siblings + 1)
513 parentAvailableHeight / toFloat (List.length context.siblings + 1)
869− Testable.true "el has fill height" <|
515+ Expect.true "el has fill height" <|
870 (floor spacePerPortion == floor context.self.bbox.height)
516 (floor spacePerPortion == floor context.self.bbox.height)
871 || minMaxTest (floor context.self.bbox.height)
517 || minMaxTest (floor context.self.bbox.height)
875 Shrink ->
520 Shrink ->
@@ -881,134 +526,33 @@ heightHelper maybeMin maybeMax len =
881 |> addMin
526 |> addMin
882 |> addMax
527 |> addMax
884− , id = Testable.IsHeight
886− \context ->
530+ \context _ ->
887− case context.selfElement of
531+ let
888− Testable.El _ _ ->
532+ childWidth child =
889− let
533+ -- TODO: add margin values to heights
890− childHeight child =
534+ child.bbox.height
891− child.bbox.height
535+
892− in
536+ totalChildren =
893− if List.isEmpty context.children then
537+ context.children
894− -- context.self.textMetrics
538+ |> List.map childWidth
895− -- |> List.map Testable.textHeight
539+ |> List.sum
897− -- TODO: apparently the font metrics we have are for the literal characters rendered
541+ verticalPadding =
898− -- not for the font itself.
542+ context.self.bbox.padding.top + context.self.bbox.padding.bottom
899− [ Testable.todo "calculate height from actual text metrics"
543+
900− ]
544+ spacingValue =
901−
545+ toFloat context.parentSpacing * (toFloat (List.length context.children) - 1)
903− [ expectRoundedEquality
547+ if totalChildren == 0 then
904− { expected =
548+ -- TODO: The issue is that we have a hard time measuring `text` elements
905− context.children
549+ -- So if a element has a text child, then it's height isn't going to show up in the system.
906− |> List.map childHeight
550+ expectRoundedEquality context.self.bbox.height context.self.bbox.height
908− |> (\h -> h + context.self.bbox.padding.top + context.self.bbox.padding.bottom)
909− , found = context.self.bbox.height
911− , Testable.lessThanOrEqual "not larger than parent"
912− context.self.bbox.height
913− context.parent.bbox.height
916− Testable.Link _ _ _ ->
921− if List.isEmpty context.children then
922− -- context.self.textMetrics
923− -- |> List.map Testable.textHeight
925− -- TODO: apparently the font metrics we have are for the literal characters rendered
926− -- not for the font itself.
927− [ Testable.todo "calculate height from actual text metrics"
931− [ expectRoundedEquality
553+ -- This fails if this element is actually a column
932− { expected =
554+ -- So we need to capture what this element is in order to do this calculation.
933− context.children
555+ expectRoundedEquality (totalChildren + verticalPadding + spacingValue) context.self.bbox.height
934− |> List.map childHeight
936− |> (\h -> h + context.self.bbox.padding.top + context.self.bbox.padding.bottom)
937− , found = context.self.bbox.height
939− , Testable.lessThanOrEqual "not larger than parent"
940− context.self.bbox.height
941− context.parent.bbox.height
949− if List.isEmpty context.children then
950− -- context.self.textMetrics
951− -- |> List.map Testable.textHeight
953− -- TODO: apparently the font metrics we have are for the literal characters rendered
954− -- not for the font itself.
955− [ Testable.todo "calculate height from actual text metrics" ]
958− [ expectRoundedEquality
961− |> List.map childHeight
963− |> Maybe.withDefault 0
964− |> (\h -> h + context.self.bbox.padding.top + context.self.bbox.padding.bottom)
965− , found = context.self.bbox.height
967− , Testable.lessThanOrEqual "not larger than parent"
968− context.self.bbox.height
969− context.parent.bbox.height
972− Testable.Column colAttrs _ ->
979− |> List.map childHeight
980− |> List.append (List.map Testable.textHeight context.self.textMetrics)
984− context.self.bbox.padding.top + context.self.bbox.padding.bottom
987− Testable.getSpacingFromAttributes colAttrs
990− toFloat spacingAmount * (toFloat (List.length context.children) - 1)
992− [ expectRoundedEquality
993− { expected = totalChildren + verticalPadding + totalSpacing
994− , found = context.self.bbox.height
996− , Testable.lessThanOrEqual "not larger than parent"
997− context.self.bbox.height
998− context.parent.bbox.height
1001− Testable.TextColumn _ _ ->
1004− Testable.Paragraph _ _ ->
@@ -1029,9 +573,8 @@ spacing space =
1029 , Testable.LabeledTest
573 , Testable.LabeledTest
1030 { label = "spacing: " ++ String.fromInt space
574 { label = "spacing: " ++ String.fromInt space
1031 , attr = Element.spacing space
575 , attr = Element.spacing space
1032− , id = Testable.NoId
1033 , test =
576 , test =
1034− \found ->
577+ \found _ ->
1036 findDistance child total =
579 findDistance child total =
1037 List.concatMap
580 List.concatMap
@@ -1077,7 +620,7 @@ spacing space =
1078 distances
621 distances
1080− [ Testable.true
623+ Expect.true
1081 ("All children are at least "
624 ("All children are at least "
1082 ++ String.fromInt space
625 ++ String.fromInt space
1083 ++ " pixels apart."
626 ++ " pixels apart."
@@ -1085,7 +628,6 @@ spacing space =
1085 ++ " are not though"
628 ++ " are not though"
1087 (allAreSpaced == [])
630 (allAreSpaced == [])
@@ -1108,33 +650,30 @@ alignLeft =
1108 Testable.LabeledTest
650 Testable.LabeledTest
1109 { label = "alignLeft"
651 { label = "alignLeft"
1110 , attr = Element.alignLeft
652 , attr = Element.alignLeft
1111− , id = Testable.NoId
1112 , test =
653 , test =
1113− \found ->
654+ \found _ ->
1114− [ if List.member found.parentLayout [ Testable.IsNearby Testable.OnLeft, Testable.IsNearby Testable.OnRight ] then
655+ if List.member found.location [ Testable.IsNearby Testable.OnLeft, Testable.IsNearby Testable.OnRight ] then
1115− Testable.true "alignLeft doesn't apply to elements that are onLeft or onRight" True
656+ Expect.true "alignLeft doesn't apply to elements that are onLeft or onRight" True
1117− else if
658+ else if
1118− List.member found.parentLayout
659+ List.member found.location
1119 [ Testable.IsNearby Testable.InFront
660 [ Testable.IsNearby Testable.InFront
1120 , Testable.IsNearby Testable.Behind
661 , Testable.IsNearby Testable.Behind
1121 , Testable.IsNearby Testable.Above
662 , Testable.IsNearby Testable.Above
1122 , Testable.IsNearby Testable.Below
663 , Testable.IsNearby Testable.Below
1125 expectRoundedEquality
666 expectRoundedEquality
1126− { found = found.self.bbox.left
667+ found.self.bbox.left
1127− , expected = found.parent.bbox.left
668+ found.parent.bbox.left
1130− else if List.length found.siblings == 0 then
670+ else if List.length found.siblings == 0 then
1131 expectRoundedEquality
671 expectRoundedEquality
1132− { found = found.self.bbox.left
672+ found.self.bbox.left
1133− , expected = found.parent.bbox.left + found.parent.bbox.padding.left
673+ (found.parent.bbox.left + found.parent.bbox.padding.left)
1137− case found.parentLayout of
676+ case found.location of
1138 Testable.InRow ->
677 Testable.InRow ->
1140 siblingsOnLeft =
679 siblingsOnLeft =
@@ -1149,16 +688,13 @@ alignLeft =
1149 |> List.sum
688 |> List.sum
1151 expectRoundedEquality
690 expectRoundedEquality
1152− { found = found.self.bbox.left
691+ found.self.bbox.left
1153− , expected = found.parent.bbox.left + (found.parent.bbox.padding.left + widthsOnLeft + spacings)
692+ (found.parent.bbox.left + (found.parent.bbox.padding.left + widthsOnLeft + spacings))
1157 expectRoundedEquality
695 expectRoundedEquality
1158− { found = found.self.bbox.left
696+ found.self.bbox.left
1159− , expected = found.parent.bbox.left + found.parent.bbox.padding.left
697+ (found.parent.bbox.left + found.parent.bbox.padding.left)
@@ -1168,9 +704,8 @@ centerX =
1168 Testable.LabeledTest
704 Testable.LabeledTest
1169 { label = "centerX"
705 { label = "centerX"
1170 , attr = Element.centerX
706 , attr = Element.centerX
1171− , id = Testable.NoId
1172 , test =
707 , test =
1173− \found ->
708+ \found _ ->
1175 selfCenter : Float
710 selfCenter : Float
1176 selfCenter =
711 selfCenter =
@@ -1180,18 +715,16 @@ centerX =
1180 parentCenter =
715 parentCenter =
1181 found.parent.bbox.left + (found.parent.bbox.width / 2)
716 found.parent.bbox.left + (found.parent.bbox.width / 2)
1183− if List.member found.parentLayout [ Testable.IsNearby Testable.OnRight, Testable.IsNearby Testable.OnLeft ] then
718+ if List.member found.location [ Testable.IsNearby Testable.OnRight, Testable.IsNearby Testable.OnLeft ] then
1184− [ Testable.true "centerX doesn't apply to elements that are onLeft or onRight" True ]
719+ Expect.true "centerX doesn't apply to elements that are onLeft or onRight" True
1186 else if List.length found.siblings == 0 then
721 else if List.length found.siblings == 0 then
1187− [ expectRoundedEquality
722+ expectRoundedEquality
1188− { found = selfCenter
723+ selfCenter
1189− , expected = parentCenter
724+ parentCenter
1194− case found.parentLayout of
727+ case found.location of
1195 Testable.InRow ->
728 Testable.InRow ->
1197 siblingsOnLeft =
730 siblingsOnLeft =
@@ -1221,18 +754,12 @@ centerX =
1224− [ expectRoundedEquality
757+ expectRoundedEquality
1225− { found = selfCenter
758+ selfCenter
1226− , expected = expectedCenter
759+ expectedCenter
1231− [ expectRoundedEquality
762+ expectRoundedEquality selfCenter parentCenter
1232− { found = selfCenter
1233− , expected = parentCenter
@@ -1242,35 +769,30 @@ alignRight =
1242 Testable.LabeledTest
769 Testable.LabeledTest
1243 { label = "alignRight"
770 { label = "alignRight"
1244 , attr = Element.alignRight
771 , attr = Element.alignRight
1245− , id = Testable.NoId
1246 , test =
772 , test =
1247− \found ->
773+ \found _ ->
1248− if List.member found.parentLayout [ Testable.IsNearby Testable.OnLeft, Testable.IsNearby Testable.OnRight ] then
774+ if List.member found.location [ Testable.IsNearby Testable.OnLeft, Testable.IsNearby Testable.OnRight ] then
1249− [ Testable.true "alignRight doesn't apply to elements that are onLeft or onRight" True ]
775+ Expect.true "alignRight doesn't apply to elements that are onLeft or onRight" True
1252− List.member found.parentLayout
778+ List.member found.location
1253 [ Testable.IsNearby Testable.InFront
779 [ Testable.IsNearby Testable.InFront
1254 , Testable.IsNearby Testable.Behind
780 , Testable.IsNearby Testable.Behind
1255 , Testable.IsNearby Testable.Above
781 , Testable.IsNearby Testable.Above
1256 , Testable.IsNearby Testable.Below
782 , Testable.IsNearby Testable.Below
1259− [ expectRoundedEquality
785+ expectRoundedEquality
1260− { found = found.self.bbox.right
786+ found.self.bbox.right
1261− , expected = found.parent.bbox.right
787+ found.parent.bbox.right
1265 else if List.length found.siblings == 0 then
789 else if List.length found.siblings == 0 then
1266− [ expectRoundedEquality
790+ expectRoundedEquality
1267− { found = found.self.bbox.right
791+ found.self.bbox.right
1268− , expected = found.parent.bbox.right + found.parent.bbox.padding.right
792+ (found.parent.bbox.right + found.parent.bbox.padding.right)
1273− case found.parentLayout of
795+ case found.location of
1274 Testable.InRow ->
796 Testable.InRow ->
1276 siblingsOnRight =
798 siblingsOnRight =
@@ -1284,18 +806,14 @@ alignRight =
1284 |> List.map (.width << .bbox)
806 |> List.map (.width << .bbox)
1285 |> List.sum
807 |> List.sum
1287− [ expectRoundedEquality
809+ expectRoundedEquality
1288− { found = found.self.bbox.right
810+ found.self.bbox.right
1289− , expected = found.parent.bbox.right - (found.parent.bbox.padding.right + widthsOnRight + spacings)
811+ (found.parent.bbox.right - (found.parent.bbox.padding.right + widthsOnRight + spacings))
1294− [ expectRoundedEquality
814+ expectRoundedEquality
1295− { found = found.self.bbox.right
815+ found.self.bbox.right
1296− , expected = found.parent.bbox.right + found.parent.bbox.padding.right
816+ (found.parent.bbox.right + found.parent.bbox.padding.right)
@@ -1305,35 +823,30 @@ alignTop =
1305 Testable.LabeledTest
823 Testable.LabeledTest
1306 { label = "alignTop"
824 { label = "alignTop"
1307 , attr = Element.alignTop
825 , attr = Element.alignTop
1308− , id = Testable.NoId
1309 , test =
826 , test =
1310− \found ->
827+ \found _ ->
1311− if List.member found.parentLayout [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
828+ if List.member found.location [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
1312− [ Testable.true "alignTop doesn't apply to elements that are above or below" True ]
829+ Expect.true "alignTop doesn't apply to elements that are above or below" True
1315− List.member found.parentLayout
832+ List.member found.location
1316 [ Testable.IsNearby Testable.InFront
833 [ Testable.IsNearby Testable.InFront
1317 , Testable.IsNearby Testable.Behind
834 , Testable.IsNearby Testable.Behind
1318 , Testable.IsNearby Testable.OnRight
835 , Testable.IsNearby Testable.OnRight
1319 , Testable.IsNearby Testable.OnLeft
836 , Testable.IsNearby Testable.OnLeft
1322− [ expectRoundedEquality
839+ expectRoundedEquality
1323− { found = found.self.bbox.top
840+ found.self.bbox.top
1324− , expected = found.parent.bbox.top
841+ found.parent.bbox.top
1328 else if List.length found.siblings == 0 then
843 else if List.length found.siblings == 0 then
1329− [ expectRoundedEquality
844+ expectRoundedEquality
1330− { found = found.self.bbox.top
845+ found.self.bbox.top
1331− , expected = found.parent.bbox.top + found.parent.bbox.padding.top
846+ (found.parent.bbox.top + found.parent.bbox.padding.top)
1336− case found.parentLayout of
849+ case found.location of
1337 Testable.InColumn ->
850 Testable.InColumn ->
1339 siblingsAbove =
852 siblingsAbove =
@@ -1347,18 +860,14 @@ alignTop =
1347 |> List.map (.height << .bbox)
860 |> List.map (.height << .bbox)
1348 |> List.sum
861 |> List.sum
1350− [ expectRoundedEquality
863+ expectRoundedEquality
1351− { found = found.self.bbox.top
864+ found.self.bbox.top
1352− , expected = found.parent.bbox.top + (found.parent.bbox.padding.top + heightsAbove + spacings)
865+ (found.parent.bbox.top + (found.parent.bbox.padding.top + heightsAbove + spacings))
1357− [ expectRoundedEquality
868+ expectRoundedEquality
1358− { found = found.self.bbox.top
869+ found.self.bbox.top
1359− , expected = found.parent.bbox.top
870+ found.parent.bbox.top
@@ -1368,35 +877,30 @@ alignBottom =
1368 Testable.LabeledTest
877 Testable.LabeledTest
1369 { label = "alignBottom"
878 { label = "alignBottom"
1370 , attr = Element.alignBottom
879 , attr = Element.alignBottom
1371− , id = Testable.NoId
1372 , test =
880 , test =
1373− \found ->
881+ \found _ ->
1374− if List.member found.parentLayout [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
882+ if List.member found.location [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
1375− [ Testable.true "alignBottom doesn't apply to elements that are above or below" True ]
883+ Expect.true "alignBottom doesn't apply to elements that are above or below" True
1378− List.member found.parentLayout
886+ List.member found.location
1379 [ Testable.IsNearby Testable.InFront
887 [ Testable.IsNearby Testable.InFront
1380 , Testable.IsNearby Testable.Behind
888 , Testable.IsNearby Testable.Behind
1381 , Testable.IsNearby Testable.OnRight
889 , Testable.IsNearby Testable.OnRight
1382 , Testable.IsNearby Testable.OnLeft
890 , Testable.IsNearby Testable.OnLeft
1385− [ expectRoundedEquality
893+ expectRoundedEquality
1386− { found = found.self.bbox.bottom
894+ found.self.bbox.bottom
1387− , expected = found.parent.bbox.bottom
895+ found.parent.bbox.bottom
1391 else if List.length found.siblings == 0 then
897 else if List.length found.siblings == 0 then
1392− [ expectRoundedEquality
898+ expectRoundedEquality
1393− { found = found.self.bbox.bottom
899+ found.self.bbox.bottom
1394− , expected = found.parent.bbox.bottom + found.parent.bbox.padding.bottom
900+ (found.parent.bbox.bottom + found.parent.bbox.padding.bottom)
1399− case found.parentLayout of
903+ case found.location of
1400 Testable.InColumn ->
904 Testable.InColumn ->
1402 siblingsBelow =
906 siblingsBelow =
@@ -1410,31 +914,20 @@ alignBottom =
1410 |> List.map (.height << .bbox)
914 |> List.map (.height << .bbox)
1411 |> List.sum
915 |> List.sum
1413− [ expectRoundedEquality
917+ expectRoundedEquality
1414− { found = found.self.bbox.bottom
918+ found.self.bbox.bottom
1415− , expected = found.parent.bbox.bottom - (found.parent.bbox.padding.bottom + heightsBelow + spacings)
919+ (found.parent.bbox.bottom - (found.parent.bbox.padding.bottom + heightsBelow + spacings))
1420− [ expectRoundedEquality
922+ expectRoundedEquality
1421− { found = found.self.bbox.bottom
923+ found.self.bbox.bottom
1422− , expected = found.parent.bbox.bottom + found.parent.bbox.padding.bottom
924+ (found.parent.bbox.bottom + found.parent.bbox.padding.bottom)
1428−expectRoundedEquality : { expected : Float, found : Float } -> Testable.LayoutExpectation
928+expectRoundedEquality x y =
1429−expectRoundedEquality { expected, found } =
929+ Expect.true ("within 1 of each other " ++ String.fromFloat x ++ ":" ++ String.fromFloat y)
1430− Testable.true
930+ (abs (x - y) < 1)
1431− ("expected " ++ floatToString expected ++ ", found " ++ floatToString found)
1432− (abs (expected - found) < 1)
1435−floatToString : Float -> String
1437− String.fromFloat (toFloat (round (x * 100)) / 100)
@@ -1443,9 +936,8 @@ centerY =
1443 Testable.LabeledTest
936 Testable.LabeledTest
1444 { label = "centerY"
937 { label = "centerY"
1445 , attr = Element.centerY
938 , attr = Element.centerY
1446− , id = Testable.NoId
1447 , test =
939 , test =
1448− \found ->
940+ \found _ ->
1450 selfCenter =
942 selfCenter =
1451 found.self.bbox.top + (found.self.bbox.height / 2)
943 found.self.bbox.top + (found.self.bbox.height / 2)
@@ -1453,18 +945,16 @@ centerY =
1453 parentCenter =
945 parentCenter =
1454 found.parent.bbox.top + (found.parent.bbox.height / 2)
946 found.parent.bbox.top + (found.parent.bbox.height / 2)
1456− if List.member found.parentLayout [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
948+ if List.member found.location [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
1457− [ Testable.true "centerY doesn't apply to elements that are above or below" True ]
949+ Expect.true "centerY doesn't apply to elements that are above or below" True
1459 else if List.length found.siblings == 0 then
951 else if List.length found.siblings == 0 then
1460− [ expectRoundedEquality
952+ expectRoundedEquality
1461− { found = selfCenter
953+ selfCenter
1462− , expected = parentCenter
954+ parentCenter
1467− case found.parentLayout of
957+ case found.location of
1468 Testable.InColumn ->
958 Testable.InColumn ->
1470 siblingsOnTop =
960 siblingsOnTop =
@@ -1494,18 +984,12 @@ centerY =
1497− [ expectRoundedEquality
987+ expectRoundedEquality
1498− { found = selfCenter
988+ selfCenter
1499− , expected = expectedCenter
989+ expectedCenter
1504− [ expectRoundedEquality
992+ expectRoundedEquality selfCenter parentCenter
1505− { found = selfCenter
1506− , expected = parentCenter
@@ -1517,12 +1001,8 @@ above element =
1517 , element = element
1001 , element = element
1518 , label = "above"
1002 , label = "above"
1519 , test =
1003 , test =
1520− \found ->
1004+ \found _ ->
1521− [ expectRoundedEquality
1005+ expectRoundedEquality found.self.bbox.bottom found.parent.bbox.top
1522− { found = found.self.bbox.bottom
1523− , expected = found.parent.bbox.top
@@ -1534,12 +1014,8 @@ below element =
1534 , element = element
1014 , element = element
1535 , label = "below"
1015 , label = "below"
1536 , test =
1016 , test =
1537− \found ->
1017+ \found _ ->
1538− [ expectRoundedEquality
1018+ expectRoundedEquality found.self.bbox.top found.parent.bbox.bottom
1539− { found = found.self.bbox.top
1540− , expected = found.parent.bbox.bottom
@@ -1551,12 +1027,8 @@ onRight element =
1551 , element = element
1027 , element = element
1552 , label = "onRight"
1028 , label = "onRight"
1553 , test =
1029 , test =
1554− \found ->
1030+ \found _ ->
1555− [ expectRoundedEquality
1031+ expectRoundedEquality found.self.bbox.left found.parent.bbox.right
1556− { found = found.self.bbox.left
1557− , expected = found.parent.bbox.right
@@ -1568,12 +1040,8 @@ onLeft element =
1568 , element = element
1040 , element = element
1569 , label = "onLeft"
1041 , label = "onLeft"
1570 , test =
1042 , test =
1571− \found ->
1043+ \found _ ->
1572− [ expectRoundedEquality
1044+ expectRoundedEquality found.self.bbox.right found.parent.bbox.left
1573− { found = found.self.bbox.right
1574− , expected = found.parent.bbox.left
@@ -1589,12 +1057,11 @@ inFront element =
1589 , element = element
1057 , element = element
1590 , label = "inFront"
1058 , label = "inFront"
1591 , test =
1059 , test =
1592− \found ->
1060+ withinHelper
1593− [ withinHelper found ]
1597−withinHelper found =
1064+withinHelper found _ =
1599 horizontalCheck =
1066 horizontalCheck =
1600 if found.self.bbox.width > found.parent.bbox.width then
1067 if found.self.bbox.width > found.parent.bbox.width then
@@ -1618,7 +1085,7 @@ withinHelper found =
1618 , compare found.self.bbox.bottom (<=) found.parent.bbox.bottom
1085 , compare found.self.bbox.bottom (<=) found.parent.bbox.bottom
1621− Testable.true "within the confines of the parent"
1088+ Expect.true "within the confines of the parent"
1622 (List.all ((==) True)
1089 (List.all ((==) True)
1623 (List.concat
1090 (List.concat
1624 [ horizontalCheck
1091 [ horizontalCheck
@@ -1636,88 +1103,5 @@ behindContent element =
1636 , element = element
1103 , element = element
1637 , label = "behindContent"
1104 , label = "behindContent"
1638 , test =
1105 , test =
1639− \found ->
1106+ withinHelper
1640− [ withinHelper found ]
1645−{- Implicit width/height calcualtions -}
1648−implicitWidthHeightShrink attrs =
1651− implicitTest (widthHelper Nothing Nothing Shrink)
1652− :: implicitTest (heightHelper Nothing Nothing Shrink)
1655− skipOverridden withImplicits
1660− Testable.LabeledTest details ->
1663− Testable.AttrTest details ->
1672− (\attr ( found, caught ) ->
1675− case attrId attr of
1679− Testable.IsWidth ->
1681− , { hasWidth = True
1682− , hasHeight = found.hasHeight
1686− Testable.IsHeight ->
1688− , { hasWidth = found.hasWidth
1701− ( { hasWidth = False
1702− , hasHeight = False
1711−{-| This is taking a normal test and rmoving its ability to attach a real `Element` attribute.
1715− Testable.LabeledTest details ->
1717− { test = details.test
1718− , label = "Implicit -> " ++ details.label