@@ -10,6 +10,7 @@ module Testable.Element exposing
15 , expectRoundedEquality
16 , expectRoundedEquality
@@ -20,9 +21,12 @@ module Testable.Element exposing
20 , isVisible
21 , isVisible
25 , moveDown
27 , moveDown
@@ -34,10 +38,14 @@ module Testable.Element exposing
40 , textColumn
47 , textColumn
41 , transparent
49 , transparent
@@ -56,17 +64,21 @@ In order to run the test:
57import Dict
65import Dict
58import Element
66import Element
60import Html.Attributes
67import Html.Attributes
61import Testable
68import Testable
62import Testable.Runner
69import 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 ]
65−layout : List (Testable.Attr msg) -> Testable.Element Testable.Runner.Msg -> Testable.Runner.TestableProgram
79+layout : List (Testable.Attr msg) -> Testable.Element Testable.Runner.Msg -> Testable.Runner.Testable
66layout attrs elem =
80layout attrs elem =
67− Testable.Runner.program
81+ Testable.Runner.testable "Test" elem
68− [ ( "Open Case", elem )
72text : String -> Testable.Element msg
84text : String -> Testable.Element msg
@@ -75,18 +87,18 @@ text =
77el : List (Testable.Attr msg) -> Testable.Element msg -> Testable.Element msg
89el : List (Testable.Attr msg) -> Testable.Element msg -> Testable.Element msg
79− Testable.El
91+ Testable.El (implicitWidthHeightShrink attrs)
82row : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
94row : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
84− Testable.Row
96+ Testable.Row (implicitWidthHeightShrink attrs)
87column : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
99column : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
88−column =
100+column attrs =
89− Testable.Column
101+ Testable.Column (implicitWidthHeightShrink attrs)
92none : Testable.Element msg
104none : Testable.Element msg
@@ -95,13 +107,66 @@ none =
97paragraph : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
109paragraph : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
98−paragraph =
110+paragraph attrs =
113+ implicitTest (widthHelper Nothing Nothing (Fill 1))
114+ :: implicitTest (heightHelper Nothing Nothing Shrink)
99− Testable.Paragraph
117+ Testable.Paragraph (skipOverridden withImplicits)
102textColumn : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
120textColumn : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
103−textColumn =
121+textColumn attrs =
124+ implicitTest (widthHelper (Just 500) (Just 750) (Fill 1))
125+ :: implicitTest (heightHelper Nothing Nothing Shrink)
104− Testable.TextColumn
128+ Testable.TextColumn (skipOverridden withImplicits)
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
107moveUp x =
172moveUp x =
@@ -112,6 +177,14 @@ moveDown x =
112 Testable.Attr (Element.moveDown x)
177 Testable.Attr (Element.moveDown x)
181+ Testable.Attr (Element.moveRight x)
185+ Testable.Attr (Element.moveLeft x)
115type Length
188type Length
117 | Fill Int
190 | Fill Int
@@ -156,11 +229,6 @@ fillPortion =
159−label : String -> Testable.Attr msg
164transparent : Bool -> Testable.Attr msg
232transparent : Bool -> Testable.Attr msg
165transparent on =
233transparent on =
166 Testable.LabeledTest
234 Testable.LabeledTest
@@ -171,8 +239,9 @@ transparent on =
173 , attr = Element.transparent on
241 , attr = Element.transparent on
242+ , id = Testable.NoId
175− \context _ ->
244+ \context ->
177 selfTransparency =
246 selfTransparency =
178 context.self.style
247 context.self.style
@@ -186,19 +255,19 @@ transparent on =
189− Expect.equal value selfTransparency
258+ [ Testable.equal value selfTransparency ]
194isVisible : Testable.Attr msg
263isVisible : Testable.Attr msg
195isVisible =
264isVisible =
196− Testable.LabeledTest
265+ Testable.AttrTest
197 { label = "is-visible"
266 { label = "is-visible"
198− , attr = Element.htmlAttribute (Html.Attributes.style "not" "applicable")
267+ , id = Testable.NoId
200− \context _ ->
269+ \context ->
201− Expect.equal context.self.isVisible True
270+ [ Testable.equal context.self.isVisible True ]
@@ -208,15 +277,16 @@ alpha a =
208 Testable.LabeledTest
277 Testable.LabeledTest
209 { label = "alpha-" ++ String.fromFloat a
278 { label = "alpha-" ++ String.fromFloat a
210 , attr = Element.alpha a
279 , attr = Element.alpha a
280+ , id = Testable.NoId
212− \context _ ->
282+ \context ->
214 selfTransparency =
284 selfTransparency =
215 context.self.style
285 context.self.style
216 |> Dict.get "opacity"
286 |> Dict.get "opacity"
217 |> Maybe.withDefault "notfound"
287 |> Maybe.withDefault "notfound"
219− Expect.equal (String.fromFloat a) selfTransparency
289+ [ Testable.equal (String.fromFloat a) selfTransparency ]
@@ -226,9 +296,10 @@ padding pad =
226 Testable.LabeledTest
296 Testable.LabeledTest
227 { label = "padding " ++ String.fromInt pad
297 { label = "padding " ++ String.fromInt pad
228 , attr = Element.padding pad
298 , attr = Element.padding pad
299+ , id = Testable.NoId
230− \found _ ->
301+ \found ->
231− Expect.true ("Padding " ++ String.fromInt pad ++ " is present")
302+ [ Testable.true ("Padding " ++ String.fromInt pad ++ " is present")
232 (List.all ((==) pad)
303 (List.all ((==) pad)
233 [ floor found.self.bbox.padding.left
304 [ floor found.self.bbox.padding.left
234 , floor found.self.bbox.padding.right
305 , floor found.self.bbox.padding.right
@@ -236,6 +307,7 @@ padding pad =
236 , floor found.self.bbox.padding.bottom
307 , floor found.self.bbox.padding.bottom
@@ -245,9 +317,10 @@ paddingXY x y =
245 Testable.LabeledTest
317 Testable.LabeledTest
246 { label = "paddingXY " ++ String.fromInt x ++ ", " ++ String.fromInt y
318 { label = "paddingXY " ++ String.fromInt x ++ ", " ++ String.fromInt y
247 , attr = Element.paddingXY x y
319 , attr = Element.paddingXY x y
320+ , id = Testable.NoId
249− \found _ ->
322+ \found ->
250− Expect.true ("PaddingXY (" ++ String.fromInt x ++ ", " ++ String.fromInt y ++ ") is present")
323+ [ Testable.true ("PaddingXY (" ++ String.fromInt x ++ ", " ++ String.fromInt y ++ ") is present")
251 (List.all ((==) x)
324 (List.all ((==) x)
252 [ floor found.self.bbox.padding.left
325 [ floor found.self.bbox.padding.left
253 , floor found.self.bbox.padding.right
326 , floor found.self.bbox.padding.right
@@ -257,9 +330,15 @@ paddingXY x y =
257 , floor found.self.bbox.padding.bottom
330 , floor found.self.bbox.padding.bottom
338+ List.filter Tuple.first ls
339+ |> List.map Tuple.second
263widthHelper maybeMin maybeMax len =
342widthHelper maybeMin maybeMax len =
265 addMin l =
344 addMin l =
@@ -319,6 +398,7 @@ widthHelper maybeMin maybeMax len =
319 -- Pixel values should ignore min and max?
398 -- Pixel values should ignore min and max?
320 Testable.LabeledTest
399 Testable.LabeledTest
321 { label = "width " ++ String.fromInt val ++ "px" ++ minLabel ++ maxLabel
400 { label = "width " ++ String.fromInt val ++ "px" ++ minLabel ++ maxLabel
401+ , id = Testable.IsWidth
323 Element.width
403 Element.width
324 (Element.px val
404 (Element.px val
@@ -326,18 +406,24 @@ widthHelper maybeMin maybeMax len =
326 |> addMax
406 |> addMax
329− \found _ ->
409+ \found ->
330− Expect.all
410+ [ expectRoundedEquality
331− [ \_ ->
411+ { expected = toFloat val
332− Expect.true "exact width is exact" (floor found.self.bbox.width == val)
412+ , found = found.self.bbox.width
333− , \_ -> Expect.true "min/max is upheld" (minMaxTest (floor found.self.bbox.width))
414+ , Testable.true "min/max is upheld" (minMaxTest (floor found.self.bbox.width))
338 Fill portion ->
418 Fill portion ->
339 Testable.LabeledTest
419 Testable.LabeledTest
421+ if portion == 1 then
422+ "width fill" ++ minLabel ++ maxLabel
340− { label = "width fill-" ++ String.fromInt portion ++ minLabel ++ maxLabel
425+ "width fill-" ++ String.fromInt portion ++ minLabel ++ maxLabel
426+ , id = Testable.IsWidth
342 Element.width
428 Element.width
343 (Element.fillPortion portion
429 (Element.fillPortion portion
@@ -345,41 +431,102 @@ widthHelper maybeMin maybeMax len =
345 |> addMax
431 |> addMax
348− \context _ ->
434+ \context ->
349− if List.member context.location [ Testable.IsNearby Testable.OnRight, Testable.IsNearby Testable.OnLeft ] then
435+ if List.member context.parentLayout [ Testable.IsNearby Testable.OnRight, Testable.IsNearby Testable.OnLeft ] then
350− Expect.true "width fill doesn't apply to onright/onleft elements" True
436+ [ Testable.true "width fill doesn't apply to onright/onleft elements" True ]
354 parentAvailableWidth =
440 parentAvailableWidth =
355 context.parent.bbox.width - (context.self.bbox.padding.left + context.self.bbox.padding.right)
441 context.parent.bbox.width - (context.self.bbox.padding.left + context.self.bbox.padding.right)
357− case context.location of
444+ [ case context.parentLayout of
358− Testable.IsNearby _ ->
445+ Testable.IsNearby _ ->
359− Expect.true "Nearby Element has fill width"
446+ [ Testable.true "Nearby Element has fill width"
360− ((floor context.parent.bbox.width == floor context.self.bbox.width)
447+ ((floor context.parent.bbox.width == floor context.self.bbox.width)
361− || minMaxTest (floor context.self.bbox.width)
448+ || minMaxTest (floor context.self.bbox.width)
364− Testable.InColumn ->
452+ Testable.InColumn ->
365− Expect.true "Element within column has fill width"
453+ [ Testable.true "Element within column has fill width"
366− ((floor parentAvailableWidth == floor context.self.bbox.width)
454+ ((floor parentAvailableWidth == floor context.self.bbox.width)
367− || minMaxTest (floor context.self.bbox.width)
455+ || minMaxTest (floor context.self.bbox.width)
370− Testable.InEl ->
459+ Testable.InEl ->
371− Expect.true "Element within element has fill width" <|
460+ [ Testable.true "Element within element has fill width" <|
372− (floor parentAvailableWidth == floor context.self.bbox.width)
461+ (floor parentAvailableWidth == floor context.self.bbox.width)
373− || minMaxTest (floor context.self.bbox.width)
462+ || minMaxTest (floor context.self.bbox.width)
377− spacePerPortion =
467+ spacePerPortion =
378− parentAvailableWidth / toFloat (List.length context.siblings + 1)
468+ parentAvailableWidth / toFloat (List.length context.siblings + 1)
380− Expect.true "element has fill width" <|
470+ [ Testable.true "element has fill width" <|
381− (floor spacePerPortion == floor context.self.bbox.width)
471+ (floor spacePerPortion == floor context.self.bbox.width)
382− || minMaxTest (floor context.self.bbox.width)
472+ || 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)
385 Shrink ->
532 Shrink ->
@@ -391,33 +538,211 @@ widthHelper maybeMin maybeMax len =
391 |> addMin
538 |> addMin
392 |> addMax
539 |> addMax
541+ , id = Testable.IsWidth
395− \context _ ->
543+ \context ->
544+ case context.selfElement of
397− childWidth child =
547+ childWidth child =
398− -- TODO: add margin values to widths
399− child.bbox.width
548+ child.bbox.width
401− totalChildren =
550+ totalChildren =
402− context.children
551+ context.children
403− |> List.map childWidth
552+ |> List.map childWidth
553+ |> List.append (List.map .width context.self.textMetrics)
404− |> List.sum
554+ |> List.sum
406− horizontalPadding =
556+ horizontalPadding =
407− context.self.bbox.padding.left + context.self.bbox.padding.right
557+ context.self.bbox.padding.left + context.self.bbox.padding.right
409− spacingValue =
559+ listIf
410− toFloat context.parentSpacing * (toFloat (List.length context.children) - 1)
560+ [ ( (context.parentLayout /= Testable.InParagraph)
411− in
561+ && (context.parentLayout /= Testable.InTextCol)
412− if totalChildren == 0 then
562+ , Testable.rounded "equals children"
413− -- TODO: The issue is that we have a hard time measuring `text` elements
563+ { expected = totalChildren + horizontalPadding
414− -- So if a element has a text child, then it's width isn't going to show up in the system.
564+ , found = context.self.bbox.width
567+ , ( context.parentLayout /= Testable.AtRoot
568+ , Testable.lessThanOrEqual "not larger than parent"
415− expectRoundedEquality context.self.bbox.width context.self.bbox.width
569+ context.self.bbox.width
570+ context.parent.bbox.width
417− else
574+ Testable.Link _ _ _ ->
418− -- This fails if this element is actually a column
575+ let
419− -- So we need to capture what this element is in order to do this calculation.
576+ childWidth child =
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.
612+ |> List.map childWidth
613+ |> List.append (List.map .width context.self.textMetrics)
617+ context.self.bbox.padding.left + context.self.bbox.padding.right
620+ Testable.getSpacingFromAttributes rowAttrs
623+ toFloat spacingAmount * (toFloat (List.length context.children) - 1)
627+ , expectRoundedEquality
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 _ _ ->
640+ -- The width of the column is the width of the widest child.
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
420− expectRoundedEquality (totalChildren + horizontalPadding + spacingValue) context.self.bbox.width
730+ { expected = totalChildren + horizontalPadding
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
@@ -486,17 +811,16 @@ heightHelper maybeMin maybeMax len =
486 |> addMin
811 |> addMin
487 |> addMax
812 |> addMax
814+ , id = Testable.IsHeight
490− \found _ ->
816+ \found ->
491− Expect.all
817+ [ expectRoundedEquality
492− [ \_ ->
818+ { expected = toFloat val
493− Expect.true ("exact height is exact: " ++ String.fromInt (floor found.self.bbox.height) ++ "," ++ String.fromInt val)
494− (floor found.self.bbox.height == val)
819+ , found = found.self.bbox.height
496− Expect.true "min/max holds true"
821+ , Testable.true "min/max holds true"
497− (minMaxTest (floor found.self.bbox.height))
822+ (minMaxTest (floor found.self.bbox.height))
502 Fill portion ->
826 Fill portion ->
@@ -508,31 +832,32 @@ heightHelper maybeMin maybeMax len =
508 |> addMin
832 |> addMin
509 |> addMax
833 |> addMax
835+ , id = Testable.IsHeight
512− \context _ ->
837+ \context ->
513− if List.member context.location [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
838+ [ if List.member context.parentLayout [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
514− Expect.true "height fill doesn't apply to above/below elements" True
839+ Testable.true "height fill doesn't apply to above/below elements" True
518 parentAvailableHeight =
843 parentAvailableHeight =
519 context.parent.bbox.height - (context.self.bbox.padding.top + context.self.bbox.padding.bottom)
844 context.parent.bbox.height - (context.self.bbox.padding.top + context.self.bbox.padding.bottom)
521− case context.location of
846+ case context.parentLayout of
522 Testable.IsNearby _ ->
847 Testable.IsNearby _ ->
523− Expect.true "Nearby Element has fill height"
848+ Testable.true "Nearby Element has fill height"
524 ((floor context.parent.bbox.height == floor context.self.bbox.height)
849 ((floor context.parent.bbox.height == floor context.self.bbox.height)
525 || minMaxTest (floor context.self.bbox.height)
850 || minMaxTest (floor context.self.bbox.height)
528 Testable.InColumn ->
853 Testable.InColumn ->
529− Expect.true "Element within column has fill height"
854+ Testable.true "Element within column has fill height"
530 ((floor parentAvailableHeight == floor context.self.bbox.height)
855 ((floor parentAvailableHeight == floor context.self.bbox.height)
531 || minMaxTest (floor context.self.bbox.height)
856 || minMaxTest (floor context.self.bbox.height)
534 Testable.InEl ->
859 Testable.InEl ->
535− Expect.true "Element within el has fill height" <|
860+ Testable.true "Element within el has fill height" <|
536 (floor parentAvailableHeight == floor context.self.bbox.height)
861 (floor parentAvailableHeight == floor context.self.bbox.height)
537 || minMaxTest (floor context.self.bbox.height)
862 || minMaxTest (floor context.self.bbox.height)
@@ -541,9 +866,10 @@ heightHelper maybeMin maybeMax len =
541 spacePerPortion =
866 spacePerPortion =
542 parentAvailableHeight / toFloat (List.length context.siblings + 1)
867 parentAvailableHeight / toFloat (List.length context.siblings + 1)
544− Expect.true "el has fill height" <|
869+ Testable.true "el has fill height" <|
545 (floor spacePerPortion == floor context.self.bbox.height)
870 (floor spacePerPortion == floor context.self.bbox.height)
546 || minMaxTest (floor context.self.bbox.height)
871 || minMaxTest (floor context.self.bbox.height)
549 Shrink ->
875 Shrink ->
@@ -555,33 +881,134 @@ heightHelper maybeMin maybeMax len =
555 |> addMin
881 |> addMin
556 |> addMax
882 |> addMax
884+ , id = Testable.IsHeight
559− \context _ ->
886+ \context ->
887+ case context.selfElement of
561− childWidth child =
890+ childHeight child =
562− -- TODO: add margin values to heights
563− child.bbox.height
891+ child.bbox.height
565− totalChildren =
893+ if List.isEmpty context.children then
566− context.children
894+ -- context.self.textMetrics
567− |> List.map childWidth
895+ -- |> List.map Testable.textHeight
568− |> List.sum
896+ -- |> List.sum
569−
897+ -- TODO: apparently the font metrics we have are for the literal characters rendered
570− verticalPadding =
898+ -- not for the font itself.
571− context.self.bbox.padding.top + context.self.bbox.padding.bottom
899+ [ Testable.todo "calculate height from actual text metrics"
574− toFloat context.parentSpacing * (toFloat (List.length context.children) - 1)
576− if totalChildren == 0 then
577− -- TODO: The issue is that we have a hard time measuring `text` elements
578− -- So if a element has a text child, then it's height isn't going to show up in the system.
579− expectRoundedEquality context.self.bbox.height context.self.bbox.height
582− -- This fails if this element is actually a column
903+ [ expectRoundedEquality
583− -- So we need to capture what this element is in order to do this calculation.
904+ { expected =
906+ |> List.map childHeight
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
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
584− expectRoundedEquality (totalChildren + verticalPadding + spacingValue) context.self.bbox.height
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 _ _ ->
@@ -602,8 +1029,9 @@ spacing space =
602 , Testable.LabeledTest
1029 , Testable.LabeledTest
603 { label = "spacing: " ++ String.fromInt space
1030 { label = "spacing: " ++ String.fromInt space
604 , attr = Element.spacing space
1031 , attr = Element.spacing space
1032+ , id = Testable.NoId
605 , test =
1033 , test =
606− \found _ ->
1034+ \found ->
608 findDistance child total =
1036 findDistance child total =
609 List.concatMap
1037 List.concatMap
@@ -649,7 +1077,7 @@ spacing space =
650 distances
1078 distances
652− Expect.true
1080+ [ Testable.true
653 ("All children are at least "
1081 ("All children are at least "
654 ++ String.fromInt space
1082 ++ String.fromInt space
655 ++ " pixels apart."
1083 ++ " pixels apart."
@@ -657,6 +1085,7 @@ spacing space =
657 ++ " are not though"
1085 ++ " are not though"
659 (allAreSpaced == [])
1087 (allAreSpaced == [])
@@ -679,30 +1108,33 @@ alignLeft =
679 Testable.LabeledTest
1108 Testable.LabeledTest
680 { label = "alignLeft"
1109 { label = "alignLeft"
681 , attr = Element.alignLeft
1110 , attr = Element.alignLeft
1111+ , id = Testable.NoId
682 , test =
1112 , test =
683− \found _ ->
1113+ \found ->
684− if List.member found.location [ Testable.IsNearby Testable.OnLeft, Testable.IsNearby Testable.OnRight ] then
1114+ [ if List.member found.parentLayout [ Testable.IsNearby Testable.OnLeft, Testable.IsNearby Testable.OnRight ] then
685− Expect.true "alignLeft doesn't apply to elements that are onLeft or onRight" True
1115+ Testable.true "alignLeft doesn't apply to elements that are onLeft or onRight" True
687− else if
1117+ else if
688− List.member found.location
1118+ List.member found.parentLayout
689 [ Testable.IsNearby Testable.InFront
1119 [ Testable.IsNearby Testable.InFront
690 , Testable.IsNearby Testable.Behind
1120 , Testable.IsNearby Testable.Behind
691 , Testable.IsNearby Testable.Above
1121 , Testable.IsNearby Testable.Above
692 , Testable.IsNearby Testable.Below
1122 , Testable.IsNearby Testable.Below
695 expectRoundedEquality
1125 expectRoundedEquality
696− found.self.bbox.left
1126+ { found = found.self.bbox.left
697− found.parent.bbox.left
1127+ , expected = found.parent.bbox.left
699− else if List.length found.siblings == 0 then
1130+ else if List.length found.siblings == 0 then
700 expectRoundedEquality
1131 expectRoundedEquality
701− found.self.bbox.left
1132+ { found = found.self.bbox.left
702− (found.parent.bbox.left + found.parent.bbox.padding.left)
1133+ , expected = found.parent.bbox.left + found.parent.bbox.padding.left
705− case found.location of
1137+ case found.parentLayout of
706 Testable.InRow ->
1138 Testable.InRow ->
708 siblingsOnLeft =
1140 siblingsOnLeft =
@@ -717,13 +1149,16 @@ alignLeft =
717 |> List.sum
1149 |> List.sum
719 expectRoundedEquality
1151 expectRoundedEquality
720− found.self.bbox.left
1152+ { found = found.self.bbox.left
721− (found.parent.bbox.left + (found.parent.bbox.padding.left + widthsOnLeft + spacings))
1153+ , expected = found.parent.bbox.left + (found.parent.bbox.padding.left + widthsOnLeft + spacings)
724 expectRoundedEquality
1157 expectRoundedEquality
725− found.self.bbox.left
1158+ { found = found.self.bbox.left
726− (found.parent.bbox.left + found.parent.bbox.padding.left)
1159+ , expected = found.parent.bbox.left + found.parent.bbox.padding.left
@@ -733,8 +1168,9 @@ centerX =
733 Testable.LabeledTest
1168 Testable.LabeledTest
734 { label = "centerX"
1169 { label = "centerX"
735 , attr = Element.centerX
1170 , attr = Element.centerX
1171+ , id = Testable.NoId
736 , test =
1172 , test =
737− \found _ ->
1173+ \found ->
739 selfCenter : Float
1175 selfCenter : Float
740 selfCenter =
1176 selfCenter =
@@ -744,16 +1180,18 @@ centerX =
744 parentCenter =
1180 parentCenter =
745 found.parent.bbox.left + (found.parent.bbox.width / 2)
1181 found.parent.bbox.left + (found.parent.bbox.width / 2)
747− if List.member found.location [ Testable.IsNearby Testable.OnRight, Testable.IsNearby Testable.OnLeft ] then
1183+ if List.member found.parentLayout [ Testable.IsNearby Testable.OnRight, Testable.IsNearby Testable.OnLeft ] then
748− Expect.true "centerX doesn't apply to elements that are onLeft or onRight" True
1184+ [ Testable.true "centerX doesn't apply to elements that are onLeft or onRight" True ]
750 else if List.length found.siblings == 0 then
1186 else if List.length found.siblings == 0 then
751− expectRoundedEquality
1187+ [ expectRoundedEquality
752− selfCenter
1188+ { found = selfCenter
753− parentCenter
1189+ , expected = parentCenter
756− case found.location of
1194+ case found.parentLayout of
757 Testable.InRow ->
1195 Testable.InRow ->
759 siblingsOnLeft =
1197 siblingsOnLeft =
@@ -783,12 +1221,18 @@ centerX =
786− expectRoundedEquality
1224+ [ expectRoundedEquality
787− selfCenter
1225+ { found = selfCenter
788− expectedCenter
1226+ , expected = expectedCenter
791− expectRoundedEquality selfCenter parentCenter
1231+ [ expectRoundedEquality
1232+ { found = selfCenter
1233+ , expected = parentCenter
@@ -798,30 +1242,35 @@ alignRight =
798 Testable.LabeledTest
1242 Testable.LabeledTest
799 { label = "alignRight"
1243 { label = "alignRight"
800 , attr = Element.alignRight
1244 , attr = Element.alignRight
1245+ , id = Testable.NoId
801 , test =
1246 , test =
802− \found _ ->
1247+ \found ->
803− if List.member found.location [ Testable.IsNearby Testable.OnLeft, Testable.IsNearby Testable.OnRight ] then
1248+ if List.member found.parentLayout [ Testable.IsNearby Testable.OnLeft, Testable.IsNearby Testable.OnRight ] then
804− Expect.true "alignRight doesn't apply to elements that are onLeft or onRight" True
1249+ [ Testable.true "alignRight doesn't apply to elements that are onLeft or onRight" True ]
807− List.member found.location
1252+ List.member found.parentLayout
808 [ Testable.IsNearby Testable.InFront
1253 [ Testable.IsNearby Testable.InFront
809 , Testable.IsNearby Testable.Behind
1254 , Testable.IsNearby Testable.Behind
810 , Testable.IsNearby Testable.Above
1255 , Testable.IsNearby Testable.Above
811 , Testable.IsNearby Testable.Below
1256 , Testable.IsNearby Testable.Below
814− expectRoundedEquality
1259+ [ expectRoundedEquality
815− found.self.bbox.right
1260+ { found = found.self.bbox.right
816− found.parent.bbox.right
1261+ , expected = found.parent.bbox.right
818 else if List.length found.siblings == 0 then
1265 else if List.length found.siblings == 0 then
819− expectRoundedEquality
1266+ [ expectRoundedEquality
820− found.self.bbox.right
1267+ { found = found.self.bbox.right
821− (found.parent.bbox.right + found.parent.bbox.padding.right)
1268+ , expected = found.parent.bbox.right + found.parent.bbox.padding.right
824− case found.location of
1273+ case found.parentLayout of
825 Testable.InRow ->
1274 Testable.InRow ->
827 siblingsOnRight =
1276 siblingsOnRight =
@@ -835,14 +1284,18 @@ alignRight =
835 |> List.map (.width << .bbox)
1284 |> List.map (.width << .bbox)
836 |> List.sum
1285 |> List.sum
838− expectRoundedEquality
1287+ [ expectRoundedEquality
839− found.self.bbox.right
1288+ { found = found.self.bbox.right
840− (found.parent.bbox.right - (found.parent.bbox.padding.right + widthsOnRight + spacings))
1289+ , expected = found.parent.bbox.right - (found.parent.bbox.padding.right + widthsOnRight + spacings)
843− expectRoundedEquality
1294+ [ expectRoundedEquality
844− found.self.bbox.right
1295+ { found = found.self.bbox.right
845− (found.parent.bbox.right + found.parent.bbox.padding.right)
1296+ , expected = found.parent.bbox.right + found.parent.bbox.padding.right
@@ -852,30 +1305,35 @@ alignTop =
852 Testable.LabeledTest
1305 Testable.LabeledTest
853 { label = "alignTop"
1306 { label = "alignTop"
854 , attr = Element.alignTop
1307 , attr = Element.alignTop
1308+ , id = Testable.NoId
855 , test =
1309 , test =
856− \found _ ->
1310+ \found ->
857− if List.member found.location [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
1311+ if List.member found.parentLayout [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
858− Expect.true "alignTop doesn't apply to elements that are above or below" True
1312+ [ Testable.true "alignTop doesn't apply to elements that are above or below" True ]
861− List.member found.location
1315+ List.member found.parentLayout
862 [ Testable.IsNearby Testable.InFront
1316 [ Testable.IsNearby Testable.InFront
863 , Testable.IsNearby Testable.Behind
1317 , Testable.IsNearby Testable.Behind
864 , Testable.IsNearby Testable.OnRight
1318 , Testable.IsNearby Testable.OnRight
865 , Testable.IsNearby Testable.OnLeft
1319 , Testable.IsNearby Testable.OnLeft
868− expectRoundedEquality
1322+ [ expectRoundedEquality
869− found.self.bbox.top
1323+ { found = found.self.bbox.top
870− found.parent.bbox.top
1324+ , expected = found.parent.bbox.top
872 else if List.length found.siblings == 0 then
1328 else if List.length found.siblings == 0 then
873− expectRoundedEquality
1329+ [ expectRoundedEquality
874− found.self.bbox.top
1330+ { found = found.self.bbox.top
875− (found.parent.bbox.top + found.parent.bbox.padding.top)
1331+ , expected = found.parent.bbox.top + found.parent.bbox.padding.top
878− case found.location of
1336+ case found.parentLayout of
879 Testable.InColumn ->
1337 Testable.InColumn ->
881 siblingsAbove =
1339 siblingsAbove =
@@ -889,14 +1347,18 @@ alignTop =
889 |> List.map (.height << .bbox)
1347 |> List.map (.height << .bbox)
890 |> List.sum
1348 |> List.sum
892− expectRoundedEquality
1350+ [ expectRoundedEquality
893− found.self.bbox.top
1351+ { found = found.self.bbox.top
894− (found.parent.bbox.top + (found.parent.bbox.padding.top + heightsAbove + spacings))
1352+ , expected = found.parent.bbox.top + (found.parent.bbox.padding.top + heightsAbove + spacings)
897− expectRoundedEquality
1357+ [ expectRoundedEquality
898− found.self.bbox.top
1358+ { found = found.self.bbox.top
899− found.parent.bbox.top
1359+ , expected = found.parent.bbox.top
@@ -906,30 +1368,35 @@ alignBottom =
906 Testable.LabeledTest
1368 Testable.LabeledTest
907 { label = "alignBottom"
1369 { label = "alignBottom"
908 , attr = Element.alignBottom
1370 , attr = Element.alignBottom
1371+ , id = Testable.NoId
909 , test =
1372 , test =
910− \found _ ->
1373+ \found ->
911− if List.member found.location [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
1374+ if List.member found.parentLayout [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
912− Expect.true "alignBottom doesn't apply to elements that are above or below" True
1375+ [ Testable.true "alignBottom doesn't apply to elements that are above or below" True ]
915− List.member found.location
1378+ List.member found.parentLayout
916 [ Testable.IsNearby Testable.InFront
1379 [ Testable.IsNearby Testable.InFront
917 , Testable.IsNearby Testable.Behind
1380 , Testable.IsNearby Testable.Behind
918 , Testable.IsNearby Testable.OnRight
1381 , Testable.IsNearby Testable.OnRight
919 , Testable.IsNearby Testable.OnLeft
1382 , Testable.IsNearby Testable.OnLeft
922− expectRoundedEquality
1385+ [ expectRoundedEquality
923− found.self.bbox.bottom
1386+ { found = found.self.bbox.bottom
924− found.parent.bbox.bottom
1387+ , expected = found.parent.bbox.bottom
926 else if List.length found.siblings == 0 then
1391 else if List.length found.siblings == 0 then
927− expectRoundedEquality
1392+ [ expectRoundedEquality
928− found.self.bbox.bottom
1393+ { found = found.self.bbox.bottom
929− (found.parent.bbox.bottom + found.parent.bbox.padding.bottom)
1394+ , expected = found.parent.bbox.bottom + found.parent.bbox.padding.bottom
932− case found.location of
1399+ case found.parentLayout of
933 Testable.InColumn ->
1400 Testable.InColumn ->
935 siblingsBelow =
1402 siblingsBelow =
@@ -943,20 +1410,31 @@ alignBottom =
943 |> List.map (.height << .bbox)
1410 |> List.map (.height << .bbox)
944 |> List.sum
1411 |> List.sum
946− expectRoundedEquality
1413+ [ expectRoundedEquality
947− found.self.bbox.bottom
1414+ { found = found.self.bbox.bottom
948− (found.parent.bbox.bottom - (found.parent.bbox.padding.bottom + heightsBelow + spacings))
1415+ , expected = found.parent.bbox.bottom - (found.parent.bbox.padding.bottom + heightsBelow + spacings)
951− expectRoundedEquality
1420+ [ expectRoundedEquality
952− found.self.bbox.bottom
1421+ { found = found.self.bbox.bottom
953− (found.parent.bbox.bottom + found.parent.bbox.padding.bottom)
1422+ , expected = found.parent.bbox.bottom + found.parent.bbox.padding.bottom
957−expectRoundedEquality x y =
1428+expectRoundedEquality : { expected : Float, found : Float } -> Testable.LayoutExpectation
958− Expect.true ("within 1 of each other " ++ String.fromFloat x ++ ":" ++ String.fromFloat y)
1429+expectRoundedEquality { expected, found } =
959− (abs (x - y) < 1)
1430+ Testable.true
1431+ ("expected " ++ floatToString expected ++ ", found " ++ floatToString found)
1432+ (abs (expected - found) < 1)
1435+floatToString : Float -> String
1437+ String.fromFloat (toFloat (round (x * 100)) / 100)
@@ -965,8 +1443,9 @@ centerY =
965 Testable.LabeledTest
1443 Testable.LabeledTest
966 { label = "centerY"
1444 { label = "centerY"
967 , attr = Element.centerY
1445 , attr = Element.centerY
1446+ , id = Testable.NoId
968 , test =
1447 , test =
969− \found _ ->
1448+ \found ->
971 selfCenter =
1450 selfCenter =
972 found.self.bbox.top + (found.self.bbox.height / 2)
1451 found.self.bbox.top + (found.self.bbox.height / 2)
@@ -974,16 +1453,18 @@ centerY =
974 parentCenter =
1453 parentCenter =
975 found.parent.bbox.top + (found.parent.bbox.height / 2)
1454 found.parent.bbox.top + (found.parent.bbox.height / 2)
977− if List.member found.location [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
1456+ if List.member found.parentLayout [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
978− Expect.true "centerY doesn't apply to elements that are above or below" True
1457+ [ Testable.true "centerY doesn't apply to elements that are above or below" True ]
980 else if List.length found.siblings == 0 then
1459 else if List.length found.siblings == 0 then
981− expectRoundedEquality
1460+ [ expectRoundedEquality
982− selfCenter
1461+ { found = selfCenter
983− parentCenter
1462+ , expected = parentCenter
986− case found.location of
1467+ case found.parentLayout of
987 Testable.InColumn ->
1468 Testable.InColumn ->
989 siblingsOnTop =
1470 siblingsOnTop =
@@ -1013,12 +1494,18 @@ centerY =
1016− expectRoundedEquality
1497+ [ expectRoundedEquality
1017− selfCenter
1498+ { found = selfCenter
1018− expectedCenter
1499+ , expected = expectedCenter
1021− expectRoundedEquality selfCenter parentCenter
1504+ [ expectRoundedEquality
1505+ { found = selfCenter
1506+ , expected = parentCenter
@@ -1030,8 +1517,12 @@ above element =
1030 , element = element
1517 , element = element
1031 , label = "above"
1518 , label = "above"
1032 , test =
1519 , test =
1033− \found _ ->
1520+ \found ->
1034− expectRoundedEquality found.self.bbox.bottom found.parent.bbox.top
1521+ [ expectRoundedEquality
1522+ { found = found.self.bbox.bottom
1523+ , expected = found.parent.bbox.top
@@ -1043,8 +1534,12 @@ below element =
1043 , element = element
1534 , element = element
1044 , label = "below"
1535 , label = "below"
1045 , test =
1536 , test =
1046− \found _ ->
1537+ \found ->
1047− expectRoundedEquality found.self.bbox.top found.parent.bbox.bottom
1538+ [ expectRoundedEquality
1539+ { found = found.self.bbox.top
1540+ , expected = found.parent.bbox.bottom
@@ -1056,8 +1551,12 @@ onRight element =
1056 , element = element
1551 , element = element
1057 , label = "onRight"
1552 , label = "onRight"
1058 , test =
1553 , test =
1059− \found _ ->
1554+ \found ->
1060− expectRoundedEquality found.self.bbox.left found.parent.bbox.right
1555+ [ expectRoundedEquality
1556+ { found = found.self.bbox.left
1557+ , expected = found.parent.bbox.right
@@ -1069,8 +1568,12 @@ onLeft element =
1069 , element = element
1568 , element = element
1070 , label = "onLeft"
1569 , label = "onLeft"
1071 , test =
1570 , test =
1072− \found _ ->
1571+ \found ->
1073− expectRoundedEquality found.self.bbox.right found.parent.bbox.left
1572+ [ expectRoundedEquality
1573+ { found = found.self.bbox.right
1574+ , expected = found.parent.bbox.left
@@ -1086,11 +1589,12 @@ inFront element =
1086 , element = element
1589 , element = element
1087 , label = "inFront"
1590 , label = "inFront"
1088 , test =
1591 , test =
1089− withinHelper
1593+ [ withinHelper found ]
1093−withinHelper found _ =
1597+withinHelper found =
1095 horizontalCheck =
1599 horizontalCheck =
1096 if found.self.bbox.width > found.parent.bbox.width then
1600 if found.self.bbox.width > found.parent.bbox.width then
@@ -1114,7 +1618,7 @@ withinHelper found _ =
1114 , compare found.self.bbox.bottom (<=) found.parent.bbox.bottom
1618 , compare found.self.bbox.bottom (<=) found.parent.bbox.bottom
1117− Expect.true "within the confines of the parent"
1621+ Testable.true "within the confines of the parent"
1118 (List.all ((==) True)
1622 (List.all ((==) True)
1119 (List.concat
1623 (List.concat
1120 [ horizontalCheck
1624 [ horizontalCheck
@@ -1132,5 +1636,88 @@ behindContent element =
1132 , element = element
1636 , element = element
1133 , label = "behindContent"
1637 , label = "behindContent"
1134 , test =
1638 , test =
1135− 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