@@ -10,6 +10,7 @@ module Testable.Element exposing
1010 , below
1111 , centerX
1212 , centerY
13+ , clip
1314 , column
1415 , el
1516 , expectRoundedEquality
@@ -37,10 +38,14 @@ module Testable.Element exposing
3738 , rgb
3839 , rgba
3940 , row
41+ , scrollbarX
42+ , scrollbarY
43+ , scrollbars
4044 , shrink
4145 , spacing
4246 , text
4347 , textColumn
48+ , toProgram
4449 , transparent
4550 , width
4651 )
@@ -64,11 +69,16 @@ import Testable
6469import Testable.Runner
6570
6671
67−layout : List (Testable.Attr msg) -> Testable.Element Testable.Runner.Msg -> Testable.Runner.TestableProgram
72+{-| This is used when we want to run all tests in a test suite instead of one at a time.
73+-}
74+toProgram : Testable.Runner.Testable -> Testable.Runner.TestableProgram
75+toProgram testable =
76+ Testable.Runner.program [ testable ]
77+
78+
79+layout : List (Testable.Attr msg) -> Testable.Element Testable.Runner.Msg -> Testable.Runner.Testable
6880layout attrs elem =
69− Testable.Runner.program
70− [ ( "Tests Run", elem )
71− ]
81+ Testable.Runner.testable "Test" elem
7282
7383
7484text : String -> Testable.Element msg
@@ -126,8 +136,31 @@ link :
126136 }
127137 -> Testable.Element msg
128138link attrs details =
129− -- TODO: this is not actually a link element!!
130− Testable.El (implicitWidthHeightShrink attrs) details.label
139+ Testable.Link details.url
140+ (implicitWidthHeightShrink attrs)
141+ details.label
142+
143+
144+clip =
145+ Testable.Attr Element.clip
146+
147+
148+{-| -}
149+scrollbars : Testable.Attr msg
150+scrollbars =
151+ Testable.Attr Element.scrollbars
152+
153+
154+{-| -}
155+scrollbarY : Testable.Attr msg
156+scrollbarY =
157+ Testable.Attr Element.scrollbarY
158+
159+
160+{-| -}
161+scrollbarX : Testable.Attr msg
162+scrollbarX =
163+ Testable.Attr Element.scrollbarX
131164
132165
133166{-| Old labeling mechanism that i removed to hastily
@@ -301,6 +334,11 @@ paddingXY x y =
301334 }
302335
303336
337+listIf ls =
338+ List.filter Tuple.first ls
339+ |> List.map Tuple.second
340+
341+
304342widthHelper maybeMin maybeMax len =
305343 let
306344 addMin l =
@@ -459,12 +497,31 @@ widthHelper maybeMin maybeMax len =
459497 totalChildren + horizontalPadding
460498
461499 expectedLines =
462− ceiling (totalCalculatedWidth / context.self.bbox.width)
500+ if boxChildrenHeight > 20 then
501+ ceiling (boxChildrenHeight / 20)
502+
503+ else
504+ ceiling (totalCalculatedWidth / context.self.bbox.width)
505+
506+ boxChildrenHeight =
507+ context.children
508+ |> List.map
509+ (\c ->
510+ c.bbox.height
511+ )
512+ |> List.sum
463513 in
464− [ Testable.rounded "text wrapping, checking height"
465− { expected = toFloat (expectedLines * 22)
466− , found = context.self.bbox.height
467− }
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)
519+
520+ else
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)
524+ )
468525 ]
469526
470527 _ ->
@@ -498,23 +555,50 @@ widthHelper maybeMin maybeMax len =
498555
499556 horizontalPadding =
500557 context.self.bbox.padding.left + context.self.bbox.padding.right
501−
502− _ =
503− Debug.log "widths"
504− { children =
505− context.children
506− |> List.map childWidth
507− , text = List.map .width context.self.textMetrics
558+ in
559+ listIf
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
508565 }
566+ )
567+ , ( context.parentLayout /= Testable.AtRoot
568+ , Testable.lessThanOrEqual "not larger than parent"
569+ context.self.bbox.width
570+ context.parent.bbox.width
571+ )
572+ ]
573+
574+ Testable.Link _ _ _ ->
575+ let
576+ childWidth child =
577+ child.bbox.width
578+
579+ totalChildren =
580+ context.children
581+ |> List.map childWidth
582+ |> List.append (List.map .width context.self.textMetrics)
583+ |> List.sum
584+
585+ horizontalPadding =
586+ context.self.bbox.padding.left + context.self.bbox.padding.right
509587 in
510− [ Testable.rounded "equals children"
511− { expected = totalChildren + horizontalPadding
512− , found = context.self.bbox.width
513− }
514− , Testable.lessThanOrEqual "not larger than parent"
515− context.self.bbox.width
516− context.parent.bbox.width
517− ]
588+ listIf
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
594+ }
595+ )
596+ , ( context.parentLayout /= Testable.AtRoot
597+ , Testable.lessThanOrEqual "not larger than parent"
598+ context.self.bbox.width
599+ context.parent.bbox.width
600+ )
601+ ]
518602
519603 Testable.Row rowAttrs _ ->
520604 -- width of row is the sum of all children widths
@@ -538,14 +622,19 @@ widthHelper maybeMin maybeMax len =
538622 totalSpacing =
539623 toFloat spacingAmount * (toFloat (List.length context.children) - 1)
540624 in
541− [ expectRoundedEquality
542− { expected = totalChildren + horizontalPadding + totalSpacing
543− , found = context.self.bbox.width
544− }
545− , Testable.lessThanOrEqual "not larger than parent"
546− context.self.bbox.width
547− context.parent.bbox.width
548− ]
625+ listIf
626+ [ ( True
627+ , expectRoundedEquality
628+ { expected = totalChildren + horizontalPadding + totalSpacing
629+ , found = context.self.bbox.width
630+ }
631+ )
632+ , ( context.parentLayout /= Testable.AtRoot
633+ , Testable.lessThanOrEqual "not larger than parent"
634+ context.self.bbox.width
635+ context.parent.bbox.width
636+ )
637+ ]
549638
550639 Testable.Column _ _ ->
551640 -- The width of the column is the width of the widest child.
@@ -569,14 +658,19 @@ widthHelper maybeMin maybeMax len =
569658 |> List.map childWidth
570659 |> List.append textChildren
571660 in
572− [ expectRoundedEquality
573− { expected = Maybe.withDefault 0 (List.maximum allChildren)
574− , found = context.self.bbox.width
575− }
576− , Testable.lessThanOrEqual "not larger than parent"
577− context.self.bbox.width
578− context.parent.bbox.width
579− ]
661+ listIf
662+ [ ( True
663+ , expectRoundedEquality
664+ { expected = Maybe.withDefault 0 (List.maximum allChildren)
665+ , found = context.self.bbox.width
666+ }
667+ )
668+ , ( context.parentLayout /= Testable.AtRoot
669+ , Testable.lessThanOrEqual "not larger than parent"
670+ context.self.bbox.width
671+ context.parent.bbox.width
672+ )
673+ ]
580674
581675 Testable.TextColumn _ _ ->
582676 -- The width of the column is the width of the widest child.
@@ -600,14 +694,19 @@ widthHelper maybeMin maybeMax len =
600694 |> List.map childWidth
601695 |> List.append textChildren
602696 in
603− [ expectRoundedEquality
604− { expected = Maybe.withDefault 0 (List.maximum allChildren)
605− , found = context.self.bbox.width
606− }
607− , Testable.lessThanOrEqual "not larger than parent"
608− context.self.bbox.width
609− context.parent.bbox.width
610− ]
697+ listIf
698+ [ ( True
699+ , expectRoundedEquality
700+ { expected = Maybe.withDefault 0 (List.maximum allChildren)
701+ , found = context.self.bbox.width
702+ }
703+ )
704+ , ( context.parentLayout /= Testable.AtRoot
705+ , Testable.lessThanOrEqual "not larger than parent"
706+ context.self.bbox.width
707+ context.parent.bbox.width
708+ )
709+ ]
611710
612711 Testable.Paragraph _ _ ->
613712 -- This should be the size it's text,
@@ -625,14 +724,19 @@ widthHelper maybeMin maybeMax len =
625724 horizontalPadding =
626725 context.self.bbox.padding.left + context.self.bbox.padding.right
627726 in
628− [ expectRoundedEquality
629− { expected = totalChildren + horizontalPadding
630− , found = context.self.bbox.width
631− }
632− , Testable.lessThanOrEqual "not larger than parent"
633− context.self.bbox.width
634− context.parent.bbox.width
635− ]
727+ listIf
728+ [ ( True
729+ , expectRoundedEquality
730+ { expected = totalChildren + horizontalPadding
731+ , found = context.self.bbox.width
732+ }
733+ )
734+ , ( context.parentLayout /= Testable.AtRoot
735+ , Testable.lessThanOrEqual "not larger than parent"
736+ context.self.bbox.width
737+ context.parent.bbox.width
738+ )
739+ ]
636740
637741 Testable.Text _ ->
638742 []
@@ -786,20 +890,45 @@ heightHelper maybeMin maybeMax len =
786890 childHeight child =
787891 child.bbox.height
788892 in
789− [ if List.isEmpty context.children then
893+ if List.isEmpty context.children then
790894 -- context.self.textMetrics
791895 -- |> List.map Testable.textHeight
792896 -- |> List.sum
793897 -- TODO: apparently the font metrics we have are for the literal characters rendered
794898 -- not for the font itself.
795− -- so for now, we are stubbing this in as 20, which is the default font size + line height.
796− Testable.rounded "expected multiple of 20"
797− { expected = context.self.bbox.height
798− , found = toFloat (List.length context.self.textMetrics * 20)
899+ [ Testable.todo "calculate height from actual text metrics"
900+ ]
901+
902+ else
903+ [ expectRoundedEquality
904+ { expected =
905+ context.children
906+ |> List.map childHeight
907+ |> List.sum
908+ |> (\h -> h + context.self.bbox.padding.top + context.self.bbox.padding.bottom)
909+ , found = context.self.bbox.height
799910 }
911+ , Testable.lessThanOrEqual "not larger than parent"
912+ context.self.bbox.height
913+ context.parent.bbox.height
914+ ]
915+
916+ Testable.Link _ _ _ ->
917+ let
918+ childHeight child =
919+ child.bbox.height
920+ in
921+ if List.isEmpty context.children then
922+ -- context.self.textMetrics
923+ -- |> List.map Testable.textHeight
924+ -- |> List.sum
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"
928+ ]
800929
801− else
802− expectRoundedEquality
930+ else
931+ [ expectRoundedEquality
803932 { expected =
804933 context.children
805934 |> List.map childHeight
@@ -807,28 +936,26 @@ heightHelper maybeMin maybeMax len =
807936 |> (\h -> h + context.self.bbox.padding.top + context.self.bbox.padding.bottom)
808937 , found = context.self.bbox.height
809938 }
810− , Testable.lessThanOrEqual "not larger than parent"
811− context.self.bbox.height
812− context.parent.bbox.height
813− ]
939+ , Testable.lessThanOrEqual "not larger than parent"
940+ context.self.bbox.height
941+ context.parent.bbox.height
942+ ]
814943
815944 Testable.Row _ _ ->
816945 let
817946 childHeight child =
818947 child.bbox.height
819948 in
820− [ if List.isEmpty context.children then
949+ if List.isEmpty context.children then
821950 -- context.self.textMetrics
822951 -- |> List.map Testable.textHeight
823952 -- |> List.sum
824953 -- TODO: apparently the font metrics we have are for the literal characters rendered
825954 -- not for the font itself.
826− -- so for now, we are stubbing this in as 20, which is the default font size.
827− Testable.true "expected multiple of 20"
828− ((round context.self.bbox.height |> modBy 20) == 0)
955+ [ Testable.todo "calculate height from actual text metrics" ]
829956
830− else
831− expectRoundedEquality
957+ else
958+ [ expectRoundedEquality
832959 { expected =
833960 context.children
834961 |> List.map childHeight
@@ -837,10 +964,10 @@ heightHelper maybeMin maybeMax len =
837964 |> (\h -> h + context.self.bbox.padding.top + context.self.bbox.padding.bottom)
838965 , found = context.self.bbox.height
839966 }
840− , Testable.lessThanOrEqual "not larger than parent"
841− context.self.bbox.height
842− context.parent.bbox.height
843− ]
967+ , Testable.lessThanOrEqual "not larger than parent"
968+ context.self.bbox.height
969+ context.parent.bbox.height
970+ ]
844971
845972 Testable.Column colAttrs _ ->
846973 let
@@ -872,16 +999,10 @@ heightHelper maybeMin maybeMax len =
872999 ]
8731000
8741001 Testable.TextColumn _ _ ->
875− [ Testable.lessThanOrEqual "not larger than parent"
876− context.self.bbox.height
877− context.parent.bbox.height
878− ]
1002+ []
8791003
8801004 Testable.Paragraph _ _ ->
881− [ Testable.lessThanOrEqual "not larger than parent"
882− context.self.bbox.height
883− context.parent.bbox.height
884− ]
1005+ []
8851006
8861007 Testable.Text _ ->
8871008 []