module Commands.TestInsertText exposing (testInsertText) import Array import Expect import RichText.Commands import RichText.Definitions import RichText.Model.Element import RichText.Model.Node import RichText.Model.Selection import RichText.Model.State import Test exposing (Test) example : RichText.Model.State.State example = RichText.Model.State.state (RichText.Model.Node.block (RichText.Model.Element.element RichText.Definitions.doc []) (RichText.Model.Node.blockChildren <| Array.fromList [ RichText.Model.Node.block (RichText.Model.Element.element RichText.Definitions.paragraph []) (RichText.Model.Node.inlineChildren <| Array.fromList [ RichText.Model.Node.plainText "text" ] ) ] ) ) (Just <| RichText.Model.Selection.caret [ 0, 0 ] 2) expectedExample : RichText.Model.State.State expectedExample = RichText.Model.State.state (RichText.Model.Node.block (RichText.Model.Element.element RichText.Definitions.doc []) (RichText.Model.Node.blockChildren <| Array.fromList [ RichText.Model.Node.block (RichText.Model.Element.element RichText.Definitions.paragraph []) (RichText.Model.Node.inlineChildren <| Array.fromList [ RichText.Model.Node.plainText "teinsertxt" ] ) ] ) ) (Just <| RichText.Model.Selection.caret [ 0, 0 ] 8) expectedRange : RichText.Model.State.State expectedRange = RichText.Model.State.state (RichText.Model.Node.block (RichText.Model.Element.element RichText.Definitions.doc []) (RichText.Model.Node.blockChildren <| Array.fromList [ RichText.Model.Node.block (RichText.Model.Element.element RichText.Definitions.paragraph []) (RichText.Model.Node.inlineChildren <| Array.fromList [ RichText.Model.Node.plainText "insertxt" ] ) ] ) ) (Just <| RichText.Model.Selection.caret [ 0, 0 ] 6) blockSelected : RichText.Model.State.State blockSelected = RichText.Model.State.state (RichText.Model.Node.block (RichText.Model.Element.element RichText.Definitions.doc []) (RichText.Model.Node.blockChildren <| Array.fromList [ RichText.Model.Node.block (RichText.Model.Element.element RichText.Definitions.paragraph []) (RichText.Model.Node.inlineChildren <| Array.fromList [ RichText.Model.Node.plainText "insertxt" ] ) , RichText.Model.Node.block (RichText.Model.Element.element RichText.Definitions.horizontalRule []) RichText.Model.Node.Leaf ] ) ) (Just <| RichText.Model.Selection.caret [ 1 ] 0) inlineSelected : RichText.Model.State.State inlineSelected = RichText.Model.State.state (RichText.Model.Node.block (RichText.Model.Element.element RichText.Definitions.doc []) (RichText.Model.Node.blockChildren <| Array.fromList [ RichText.Model.Node.block (RichText.Model.Element.element RichText.Definitions.paragraph []) (RichText.Model.Node.inlineChildren <| Array.fromList [ RichText.Model.Node.inlineElement (RichText.Model.Element.element RichText.Definitions.image []) [] ] ) ] ) ) (Just <| RichText.Model.Selection.caret [ 0, 0 ] 0) testInsertText : Test testInsertText = Test.describe "Tests the insertText transform" [ Test.test "Tests that the example case works as expected" <| \_ -> Expect.equal (Ok expectedExample) (RichText.Commands.insertText "insert" example) , Test.test "it should insert into a range" <| \_ -> Expect.equal (Ok expectedRange) (RichText.Commands.insertText "insert" (example |> RichText.Model.State.withSelection (Just <| RichText.Model.Selection.singleNodeRange [ 0, 0 ] 0 2) ) ) , Test.test "it should fail if a block leaf is selected" <| \_ -> Expect.equal (Err "I was expecting a text leaf, but instead I found a block node") (RichText.Commands.insertText "insert" blockSelected) , Test.test "it should fail if an inline leaf is selected" <| \_ -> Expect.equal (Err "I was expecting a text leaf, but instead found an inline element") (RichText.Commands.insertText "insert" inlineSelected) ]