mirror of
https://github.com/NoRedInk/noredink-ui.git
synced 2024-09-11 07:05:38 +03:00
Merge #1665
1665: Visual highlighter overlap tests r=micahhahn a=omnibs Adds new tests for `Nri.Ui.Highlighter.V5`'s `selectShortest` function, making scenarios easier to inspect and craft visually. No API changes anywhere. Co-authored-by: Juliano Solanho <juliano.solanho@gmail.com>
This commit is contained in:
commit
a61ed6a1de
@ -27,7 +27,6 @@ spec =
|
|||||||
, describe "markdown highlightable behavior" markdownContentTests
|
, describe "markdown highlightable behavior" markdownContentTests
|
||||||
, describe "markdown highlight name behavior" markdownHighlightNameTests
|
, describe "markdown highlight name behavior" markdownHighlightNameTests
|
||||||
, describe "joinAdjacentInteractiveHighlights" joinAdjacentInteractiveHighlightsTests
|
, describe "joinAdjacentInteractiveHighlights" joinAdjacentInteractiveHighlightsTests
|
||||||
, describe "selectShortest" selectShortestTests
|
|
||||||
, describe "overlapping highlights" overlappingHighlightTests
|
, describe "overlapping highlights" overlappingHighlightTests
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -727,116 +726,6 @@ joinAdjacentInteractiveHighlightsTests =
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
selectShortestTests : List Test
|
|
||||||
selectShortestTests =
|
|
||||||
let
|
|
||||||
init highlightables =
|
|
||||||
Highlighter.init
|
|
||||||
{ id = "test-highlighter-container"
|
|
||||||
, highlightables = highlightables
|
|
||||||
, marker = markerModel (Just "A")
|
|
||||||
, joinAdjacentInteractiveHighlights = False
|
|
||||||
, sorter = Sort.alphabetical
|
|
||||||
}
|
|
||||||
in
|
|
||||||
[ test "without any highlightables, returns Nothing" <|
|
|
||||||
\() ->
|
|
||||||
init []
|
|
||||||
|> Highlighter.selectShortest (.highlightables >> List.Extra.getAt 0)
|
|
||||||
|> Expect.equal Nothing
|
|
||||||
, test "with 1 unmarked highlightable, returns Nothing" <|
|
|
||||||
\() ->
|
|
||||||
init [ Highlightable.initInteractive [] 0 "hello" ]
|
|
||||||
|> Highlighter.selectShortest (.highlightables >> List.Extra.getAt 0)
|
|
||||||
|> Expect.equal Nothing
|
|
||||||
, test "with 1 marked highlightable, returns the singular mark type" <|
|
|
||||||
\() ->
|
|
||||||
init [ Highlightable.initInteractive [ marker (Just "B") ] 0 "hello" ]
|
|
||||||
|> Highlighter.selectShortest (.highlightables >> List.Extra.getAt 0)
|
|
||||||
|> Expect.equal (Just "B")
|
|
||||||
, test "with 1 multi-marked highlightable, returns one of the mark types depending on sort order" <|
|
|
||||||
\() ->
|
|
||||||
init
|
|
||||||
[ Highlightable.initInteractive
|
|
||||||
[ marker (Just "C")
|
|
||||||
, marker (Just "B")
|
|
||||||
, marker (Just "D")
|
|
||||||
]
|
|
||||||
0
|
|
||||||
"hello"
|
|
||||||
]
|
|
||||||
|> Highlighter.selectShortest (.highlightables >> List.Extra.getAt 0)
|
|
||||||
|> Expect.equal (Just "B")
|
|
||||||
, test "with multiple marked highlightables, selecting the first highlightable, returns the shortest mark type" <|
|
|
||||||
\() ->
|
|
||||||
init
|
|
||||||
[ Highlightable.initInteractive
|
|
||||||
[ marker (Just "C")
|
|
||||||
, marker (Just "B")
|
|
||||||
]
|
|
||||||
0
|
|
||||||
"hello"
|
|
||||||
, Highlightable.initInteractive
|
|
||||||
[ marker (Just "B")
|
|
||||||
]
|
|
||||||
1
|
|
||||||
"world"
|
|
||||||
, Highlightable.initInteractive
|
|
||||||
[ marker (Just "C")
|
|
||||||
]
|
|
||||||
2
|
|
||||||
"!"
|
|
||||||
]
|
|
||||||
|> Highlighter.selectShortest (.highlightables >> List.Extra.getAt 0)
|
|
||||||
|> Expect.equal (Just "C")
|
|
||||||
, test "with multiple marked highlightables, selecting the second highlightable, returns the shortest mark type" <|
|
|
||||||
\() ->
|
|
||||||
init
|
|
||||||
[ Highlightable.initInteractive
|
|
||||||
[ marker (Just "B")
|
|
||||||
]
|
|
||||||
0
|
|
||||||
"hello"
|
|
||||||
, Highlightable.initInteractive
|
|
||||||
[ marker (Just "B")
|
|
||||||
, marker (Just "C")
|
|
||||||
]
|
|
||||||
1
|
|
||||||
"world"
|
|
||||||
, Highlightable.initInteractive
|
|
||||||
[ marker (Just "C")
|
|
||||||
]
|
|
||||||
2
|
|
||||||
"!"
|
|
||||||
]
|
|
||||||
|> Highlighter.selectShortest (.highlightables >> List.Extra.getAt 1)
|
|
||||||
|> Expect.equal (Just "C")
|
|
||||||
, test "with multiple marked highlightables, selecting the third highlightable, returns the shortest mark type" <|
|
|
||||||
\() ->
|
|
||||||
init
|
|
||||||
[ Highlightable.initInteractive
|
|
||||||
[ marker (Just "B")
|
|
||||||
]
|
|
||||||
0
|
|
||||||
"hello"
|
|
||||||
, Highlightable.initInteractive
|
|
||||||
[ marker (Just "B")
|
|
||||||
, marker (Just "C")
|
|
||||||
]
|
|
||||||
1
|
|
||||||
"world"
|
|
||||||
, Highlightable.initInteractive
|
|
||||||
[ marker (Just "C")
|
|
||||||
, marker (Just "B")
|
|
||||||
]
|
|
||||||
2
|
|
||||||
"!"
|
|
||||||
]
|
|
||||||
|> Highlighter.selectShortest (.highlightables >> List.Extra.getAt 2)
|
|
||||||
|> Expect.equal (Just "C")
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
overlappingHighlightTests : List Test
|
overlappingHighlightTests : List Test
|
||||||
overlappingHighlightTests =
|
overlappingHighlightTests =
|
||||||
let
|
let
|
||||||
|
145
tests/Spec/Nri/Ui/HighlighterOverlaps.elm
Normal file
145
tests/Spec/Nri/Ui/HighlighterOverlaps.elm
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
module Spec.Nri.Ui.HighlighterOverlaps exposing (spec)
|
||||||
|
|
||||||
|
import Expect exposing (Expectation)
|
||||||
|
import List.Extra
|
||||||
|
import Maybe.Extra
|
||||||
|
import Nri.Ui.Colors.V1 as Colors
|
||||||
|
import Nri.Ui.Highlightable.V3 as Highlightable
|
||||||
|
import Nri.Ui.Highlighter.V5 as Highlighter
|
||||||
|
import Nri.Ui.HighlighterTool.V1 as Tool
|
||||||
|
import Sort
|
||||||
|
import Test exposing (..)
|
||||||
|
|
||||||
|
|
||||||
|
spec : Test
|
||||||
|
spec =
|
||||||
|
describe "Highlighter#selectShortest"
|
||||||
|
[ test "no overlap" <|
|
||||||
|
\_ ->
|
||||||
|
init2
|
||||||
|
|> marker "### "
|
||||||
|
|> marker " ***"
|
||||||
|
|> cursor " ^ "
|
||||||
|
|> expect "*"
|
||||||
|
, test "shortest at start" <|
|
||||||
|
\_ ->
|
||||||
|
init2
|
||||||
|
|> marker "# "
|
||||||
|
|> marker "***"
|
||||||
|
|> cursor "^ "
|
||||||
|
|> expect "#"
|
||||||
|
, test "shortest in the middle" <|
|
||||||
|
\_ ->
|
||||||
|
init2
|
||||||
|
|> marker " # "
|
||||||
|
|> marker "***"
|
||||||
|
|> cursor " ^ "
|
||||||
|
|> expect "#"
|
||||||
|
, test "shortest at the end" <|
|
||||||
|
\_ ->
|
||||||
|
init2
|
||||||
|
|> marker " #"
|
||||||
|
|> marker "***"
|
||||||
|
|> cursor " ^"
|
||||||
|
|> expect "#"
|
||||||
|
, test "shortest intersects from left" <|
|
||||||
|
\_ ->
|
||||||
|
init2
|
||||||
|
|> marker "#### "
|
||||||
|
|> marker " ***"
|
||||||
|
|> cursor " ^ "
|
||||||
|
|> expect "*"
|
||||||
|
, test "shortest intersects from right" <|
|
||||||
|
\_ ->
|
||||||
|
init2
|
||||||
|
|> marker " ####"
|
||||||
|
|> marker "*** "
|
||||||
|
|> cursor " ^ "
|
||||||
|
|> expect "*"
|
||||||
|
, test "shortest is non-contiguous" <|
|
||||||
|
\_ ->
|
||||||
|
init2
|
||||||
|
|> marker " #### "
|
||||||
|
|> marker "* * *"
|
||||||
|
|> cursor " ^ "
|
||||||
|
|> expect "*"
|
||||||
|
, test "longest is non-contiguous" <|
|
||||||
|
\_ ->
|
||||||
|
init2
|
||||||
|
|> marker " #### "
|
||||||
|
|> marker "***** * *****"
|
||||||
|
|> cursor " ^ "
|
||||||
|
|> expect "#"
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
init2 : String -> String -> String -> Highlighter.Model String
|
||||||
|
init2 marker1 marker2 cursor_ =
|
||||||
|
let
|
||||||
|
highlightables =
|
||||||
|
List.Extra.zip (String.toList marker1) (String.toList marker2)
|
||||||
|
|> List.indexedMap
|
||||||
|
(\idx ( a, b ) ->
|
||||||
|
Highlightable.initInteractive
|
||||||
|
(markers a b)
|
||||||
|
idx
|
||||||
|
" "
|
||||||
|
)
|
||||||
|
|
||||||
|
cursorIndex =
|
||||||
|
String.toList cursor_
|
||||||
|
|> List.Extra.elemIndex '^'
|
||||||
|
|> Maybe.withDefault -1
|
||||||
|
in
|
||||||
|
Highlighter.init
|
||||||
|
{ id = "test-highlighter-container"
|
||||||
|
, highlightables = highlightables
|
||||||
|
, marker = Tool.Marker (mkMarker "unused")
|
||||||
|
, joinAdjacentInteractiveHighlights = False
|
||||||
|
, sorter = Sort.alphabetical
|
||||||
|
}
|
||||||
|
|> Highlighter.update (Highlighter.Pointer (Highlighter.Over cursorIndex))
|
||||||
|
|> (\( model, _, _ ) -> model)
|
||||||
|
|
||||||
|
|
||||||
|
marker : String -> (String -> a) -> a
|
||||||
|
marker str f =
|
||||||
|
f str
|
||||||
|
|
||||||
|
|
||||||
|
cursor : String -> (String -> a) -> a
|
||||||
|
cursor str f =
|
||||||
|
f str
|
||||||
|
|
||||||
|
|
||||||
|
expect : String -> Highlighter.Model String -> Expectation
|
||||||
|
expect cursorName highlighter =
|
||||||
|
Highlighter.selectShortest Highlighter.hoveredHighlightable highlighter
|
||||||
|
|> Expect.equal (Just cursorName)
|
||||||
|
|
||||||
|
|
||||||
|
markers : Char -> Char -> List (Tool.MarkerModel String)
|
||||||
|
markers a b =
|
||||||
|
Maybe.Extra.values
|
||||||
|
[ if a == ' ' then
|
||||||
|
Nothing
|
||||||
|
|
||||||
|
else
|
||||||
|
Just (mkMarker (String.fromChar a))
|
||||||
|
, if b == ' ' then
|
||||||
|
Nothing
|
||||||
|
|
||||||
|
else
|
||||||
|
Just (mkMarker (String.fromChar b))
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
mkMarker : String -> Tool.MarkerModel String
|
||||||
|
mkMarker str =
|
||||||
|
Tool.buildMarker
|
||||||
|
{ highlightColor = Colors.magenta
|
||||||
|
, hoverColor = Colors.magenta
|
||||||
|
, hoverHighlightColor = Colors.magenta
|
||||||
|
, kind = str
|
||||||
|
, name = Just str
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user