@@ -10,6 +10,7 @@ module Testable.Element exposing
15 , expectRoundedEquality
16 , expectRoundedEquality
@@ -37,10 +38,14 @@ module Testable.Element exposing
43 , textColumn
47 , textColumn
44 , transparent
49 , transparent
@@ -64,11 +69,16 @@ import Testable
64import 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 ]
67−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
68layout attrs elem =
80layout attrs elem =
69− Testable.Runner.program
81+ Testable.Runner.testable "Test" elem
70− [ ( "Tests Run", elem )
74text : String -> Testable.Element msg
84text : String -> Testable.Element msg
@@ -126,8 +136,31 @@ link :
127 -> Testable.Element msg
137 -> Testable.Element msg
128link attrs details =
138link attrs details =
129− -- TODO: this is not actually a link element!!
139+ Testable.Link details.url
130− Testable.El (implicitWidthHeightShrink attrs) details.label
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
133{-| Old labeling mechanism that i removed to hastily
166{-| Old labeling mechanism that i removed to hastily
@@ -301,6 +334,11 @@ paddingXY x y =
338+ List.filter Tuple.first ls
339+ |> List.map Tuple.second
304widthHelper maybeMin maybeMax len =
342widthHelper maybeMin maybeMax len =
306 addMin l =
344 addMin l =
@@ -402,36 +440,93 @@ widthHelper maybeMin maybeMax len =
402 parentAvailableWidth =
440 parentAvailableWidth =
403 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)
405− [ case context.parentLayout of
444+ [ case context.parentLayout of
406− Testable.IsNearby _ ->
445+ Testable.IsNearby _ ->
407− Testable.true "Nearby Element has fill width"
446+ [ Testable.true "Nearby Element has fill width"
408− ((floor context.parent.bbox.width == floor context.self.bbox.width)
447+ ((floor context.parent.bbox.width == floor context.self.bbox.width)
409− || minMaxTest (floor context.self.bbox.width)
448+ || minMaxTest (floor context.self.bbox.width)
412− Testable.InColumn ->
413− Testable.true "Element within column has fill width"
414− ((floor parentAvailableWidth == floor context.self.bbox.width)
415− || minMaxTest (floor context.self.bbox.width)
452+ Testable.InColumn ->
453+ [ Testable.true "Element within column has fill width"
454+ ((floor parentAvailableWidth == floor context.self.bbox.width)
455+ || minMaxTest (floor context.self.bbox.width)
418− Testable.InEl ->
459+ Testable.InEl ->
419− Testable.true "Element within element has fill width" <|
460+ [ Testable.true "Element within element has fill width" <|
420− (floor parentAvailableWidth == floor context.self.bbox.width)
461+ (floor parentAvailableWidth == floor context.self.bbox.width)
462+ || minMaxTest (floor context.self.bbox.width)
468+ parentAvailableWidth / toFloat (List.length context.siblings + 1)
470+ [ Testable.true "element has fill width" <|
471+ (floor spacePerPortion == floor context.self.bbox.width)
421− || 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)
426− parentAvailableWidth / toFloat (List.length context.siblings + 1)
428− Testable.true "element has fill width" <|
429− (floor spacePerPortion == floor context.self.bbox.width)
430− || minMaxTest (floor context.self.bbox.width)
431− , Testable.lessThanOrEqual "not larger than parent"
432− context.self.bbox.width
433− context.parent.bbox.width
437 Shrink ->
532 Shrink ->
@@ -461,14 +556,49 @@ widthHelper maybeMin maybeMax len =
461 horizontalPadding =
556 horizontalPadding =
462 context.self.bbox.padding.left + context.self.bbox.padding.right
557 context.self.bbox.padding.left + context.self.bbox.padding.right
464− [ expectRoundedEquality
559+ listIf
560+ [ ( (context.parentLayout /= Testable.InParagraph)
561+ && (context.parentLayout /= Testable.InTextCol)
562+ , Testable.rounded "equals children"
465− { expected = totalChildren + horizontalPadding
563+ { expected = totalChildren + horizontalPadding
466− , found = context.self.bbox.width
564+ , found = context.self.bbox.width
567+ , ( context.parentLayout /= Testable.AtRoot
468− , Testable.lessThanOrEqual "not larger than parent"
568+ , Testable.lessThanOrEqual "not larger than parent"
569+ context.self.bbox.width
570+ context.parent.bbox.width
574+ Testable.Link _ _ _ ->
581+ |> List.map childWidth
582+ |> List.append (List.map .width context.self.textMetrics)
469− context.self.bbox.width
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
470− context.parent.bbox.width
599+ context.parent.bbox.width
473 Testable.Row rowAttrs _ ->
603 Testable.Row rowAttrs _ ->
474 -- width of row is the sum of all children widths
604 -- width of row is the sum of all children widths
@@ -492,14 +622,19 @@ widthHelper maybeMin maybeMax len =
492 totalSpacing =
622 totalSpacing =
493 toFloat spacingAmount * (toFloat (List.length context.children) - 1)
623 toFloat spacingAmount * (toFloat (List.length context.children) - 1)
495− [ expectRoundedEquality
627+ , expectRoundedEquality
496− { expected = totalChildren + horizontalPadding + totalSpacing
628+ { expected = totalChildren + horizontalPadding + totalSpacing
497− , found = context.self.bbox.width
629+ , found = context.self.bbox.width
632+ , ( context.parentLayout /= Testable.AtRoot
499− , Testable.lessThanOrEqual "not larger than parent"
633+ , Testable.lessThanOrEqual "not larger than parent"
500− context.self.bbox.width
634+ context.self.bbox.width
501− context.parent.bbox.width
635+ context.parent.bbox.width
504 Testable.Column _ _ ->
639 Testable.Column _ _ ->
505 -- The width of the column is the width of the widest child.
640 -- The width of the column is the width of the widest child.
@@ -523,14 +658,19 @@ widthHelper maybeMin maybeMax len =
523 |> List.map childWidth
658 |> List.map childWidth
524 |> List.append textChildren
659 |> List.append textChildren
526− [ expectRoundedEquality
663+ , expectRoundedEquality
527− { expected = Maybe.withDefault 0 (List.maximum allChildren)
664+ { expected = Maybe.withDefault 0 (List.maximum allChildren)
528− , found = context.self.bbox.width
665+ , found = context.self.bbox.width
668+ , ( context.parentLayout /= Testable.AtRoot
530− , Testable.lessThanOrEqual "not larger than parent"
669+ , Testable.lessThanOrEqual "not larger than parent"
531− context.self.bbox.width
670+ context.self.bbox.width
532− context.parent.bbox.width
671+ context.parent.bbox.width
535 Testable.TextColumn _ _ ->
675 Testable.TextColumn _ _ ->
536 -- The width of the column is the width of the widest child.
676 -- The width of the column is the width of the widest child.
@@ -554,14 +694,19 @@ widthHelper maybeMin maybeMax len =
554 |> List.map childWidth
694 |> List.map childWidth
555 |> List.append textChildren
695 |> List.append textChildren
557− [ expectRoundedEquality
699+ , expectRoundedEquality
558− { expected = Maybe.withDefault 0 (List.maximum allChildren)
700+ { expected = Maybe.withDefault 0 (List.maximum allChildren)
559− , found = context.self.bbox.width
701+ , found = context.self.bbox.width
704+ , ( context.parentLayout /= Testable.AtRoot
561− , Testable.lessThanOrEqual "not larger than parent"
705+ , Testable.lessThanOrEqual "not larger than parent"
562− context.self.bbox.width
706+ context.self.bbox.width
563− context.parent.bbox.width
707+ context.parent.bbox.width
566 Testable.Paragraph _ _ ->
711 Testable.Paragraph _ _ ->
567 -- This should be the size it's text,
712 -- This should be the size it's text,
@@ -579,14 +724,19 @@ widthHelper maybeMin maybeMax len =
579 horizontalPadding =
724 horizontalPadding =
580 context.self.bbox.padding.left + context.self.bbox.padding.right
725 context.self.bbox.padding.left + context.self.bbox.padding.right
582− [ expectRoundedEquality
729+ , expectRoundedEquality
583− { expected = totalChildren + horizontalPadding
730+ { expected = totalChildren + horizontalPadding
584− , found = context.self.bbox.width
731+ , found = context.self.bbox.width
734+ , ( context.parentLayout /= Testable.AtRoot
586− , Testable.lessThanOrEqual "not larger than parent"
735+ , Testable.lessThanOrEqual "not larger than parent"
587− context.self.bbox.width
736+ context.self.bbox.width
588− context.parent.bbox.width
737+ context.parent.bbox.width
591 Testable.Text _ ->
741 Testable.Text _ ->
@@ -740,18 +890,17 @@ heightHelper maybeMin maybeMax len =
740 childHeight child =
890 childHeight child =
741 child.bbox.height
891 child.bbox.height
743− [ if List.isEmpty context.children then
893+ if List.isEmpty context.children then
744 -- context.self.textMetrics
894 -- context.self.textMetrics
745 -- |> List.map Testable.textHeight
895 -- |> List.map Testable.textHeight
746 -- |> List.sum
896 -- |> List.sum
747 -- TODO: apparently the font metrics we have are for the literal characters rendered
897 -- TODO: apparently the font metrics we have are for the literal characters rendered
748 -- not for the font itself.
898 -- not for the font itself.
749− -- so for now, we are stubbing this in as 20, which is the default font size.
899+ [ Testable.todo "calculate height from actual text metrics"
750− Testable.true "expected multiple of 20"
900+ ]
751− ((round context.self.bbox.height |> modBy 20) == 0)
754− expectRoundedEquality
903+ [ expectRoundedEquality
755 { expected =
904 { expected =
756 context.children
905 context.children
757 |> List.map childHeight
906 |> List.map childHeight
@@ -759,28 +908,54 @@ heightHelper maybeMin maybeMax len =
759 |> (\h -> h + context.self.bbox.padding.top + context.self.bbox.padding.bottom)
908 |> (\h -> h + context.self.bbox.padding.top + context.self.bbox.padding.bottom)
760 , found = context.self.bbox.height
909 , found = context.self.bbox.height
762− , Testable.lessThanOrEqual "not larger than parent"
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
763− context.self.bbox.height
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
764− context.parent.bbox.height
941+ context.parent.bbox.height
767 Testable.Row _ _ ->
944 Testable.Row _ _ ->
769 childHeight child =
946 childHeight child =
770 child.bbox.height
947 child.bbox.height
772− [ if List.isEmpty context.children then
949+ if List.isEmpty context.children then
773 -- context.self.textMetrics
950 -- context.self.textMetrics
774 -- |> List.map Testable.textHeight
951 -- |> List.map Testable.textHeight
775 -- |> List.sum
952 -- |> List.sum
776 -- TODO: apparently the font metrics we have are for the literal characters rendered
953 -- TODO: apparently the font metrics we have are for the literal characters rendered
777 -- not for the font itself.
954 -- not for the font itself.
778− -- so for now, we are stubbing this in as 20, which is the default font size.
955+ [ Testable.todo "calculate height from actual text metrics" ]
779− Testable.true "expected multiple of 20"
780− ((round context.self.bbox.height |> modBy 20) == 0)
783− expectRoundedEquality
958+ [ expectRoundedEquality
784 { expected =
959 { expected =
785 context.children
960 context.children
786 |> List.map childHeight
961 |> List.map childHeight
@@ -789,10 +964,10 @@ heightHelper maybeMin maybeMax len =
789 |> (\h -> h + context.self.bbox.padding.top + context.self.bbox.padding.bottom)
964 |> (\h -> h + context.self.bbox.padding.top + context.self.bbox.padding.bottom)
790 , found = context.self.bbox.height
965 , found = context.self.bbox.height
792− , Testable.lessThanOrEqual "not larger than parent"
967+ , Testable.lessThanOrEqual "not larger than parent"
793− context.self.bbox.height
968+ context.self.bbox.height
794− context.parent.bbox.height
969+ context.parent.bbox.height
797 Testable.Column colAttrs _ ->
972 Testable.Column colAttrs _ ->
@@ -824,16 +999,10 @@ heightHelper maybeMin maybeMax len =
826 Testable.TextColumn _ _ ->
1001 Testable.TextColumn _ _ ->
827− [ Testable.lessThanOrEqual "not larger than parent"
828− context.self.bbox.height
829− context.parent.bbox.height
832 Testable.Paragraph _ _ ->
1004 Testable.Paragraph _ _ ->
833− [ Testable.lessThanOrEqual "not larger than parent"
834− context.self.bbox.height
835− context.parent.bbox.height
838 Testable.Text _ ->
1007 Testable.Text _ ->