testTextInsertTextInsert :: TestTree
testTextInsertTextInsert = 
  let ti1 = O.TextInsert 0 'x' 0
      ti2 = O.TextInsert 0 'y' 1
      ti3 = O.TextInsert 0 'z' 0
      ti4 = O.TextInsert 1 '_' 10 in
  testGroup "TextInsert vs TextInsert"
  [ testCase "Wins tiebreaker" $ do
      assertEqual "a" (Just ti2) $ T.transform ti2 ti1 T.Left
      assertEqual "b" (Just ti2) $ T.transform ti2 ti1 T.Right
      assertEqual "c" (Just ti1) $ T.transform ti1 ti3 T.Right
  , testCase "Loses tiebreaker" $ do
      assertEqual "a" (Just $ O.TextInsert 1 'x' 0) $ T.transform ti1 ti2 T.Left
      assertEqual "b" (Just $ O.TextInsert 1 'x' 0) $ T.transform ti1 ti2 T.Right
      assertEqual "c" (Just $ O.TextInsert 1 'x' 0) $ T.transform ti1 ti3 T.Left
  , testCase "Not affected" $ do
      assertEqual "a" (Just ti1) $ T.transform ti1 ti4 T.Left
      assertEqual "b" (Just ti1) $ T.transform ti1 ti4 T.Right
  , testCase "Index incremented" $ do
      assertEqual "a" (Just $ O.TextInsert 2 '_' 10) $ T.transform ti4 ti1 T.Left
      assertEqual "b" (Just $ O.TextInsert 2 '_' 10) $ T.transform ti4 ti1 T.Right
  ]
testTextInsertTextInsert :: TestTree
testTextInsertTextInsert = 
  let ti1 = O.TextInsert 0 'x' 0
      ti2 = O.TextInsert 0 'y' 1
      ti3 = O.TextInsert 0 'z' 0
      ti4 = O.TextInsert 1 '_' 10 in
  testGroup "TextInsert vs TextInsert"
  [ testCase "Wins tiebreaker" $ do
      assertEqual "a" (Just ti2) $ T.transform ti2 ti1 T.Left
      assertEqual "b" (Just ti2) $ T.transform ti2 ti1 T.Right
      assertEqual "c" (Just ti1) $ T.transform ti1 ti3 T.Right
  , testCase "Loses tiebreaker" $ do
      assertEqual "a" (Just $ O.TextInsert 1 'x' 0) $ T.transform ti1 ti2 T.Left
      assertEqual "b" (Just $ O.TextInsert 1 'x' 0) $ T.transform ti1 ti2 T.Right
      assertEqual "c" (Just $ O.TextInsert 1 'x' 0) $ T.transform ti1 ti3 T.Left
  , testCase "Not affected" $ do
      assertEqual "a" (Just ti1) $ T.transform ti1 ti4 T.Left
      assertEqual "b" (Just ti1) $ T.transform ti1 ti4 T.Right
  , testCase "Index incremented" $ do
      assertEqual "a" (Just $ O.TextInsert 2 '_' 10) $ T.transform ti4 ti1 T.Left
      assertEqual "b" (Just $ O.TextInsert 2 '_' 10) $ T.transform ti4 ti1 T.Right
  ]
testTextInsertTextInsert = 
  let ti1 = O.TextInsert 0 'x' 0
      ti2 = O.TextInsert 0 'y' 1
      ti3 = O.TextInsert 0 'z' 0
      ti4 = O.TextInsert 1 '_' 10 in
  testGroup "TextInsert vs TextInsert"
  [ testCase "Wins tiebreaker" $ do
      assertEqual "a" (Just ti2) $ T.transform ti2 ti1 T.Left
      assertEqual "b" (Just ti2) $ T.transform ti2 ti1 T.Right
      assertEqual "c" (Just ti1) $ T.transform ti1 ti3 T.Right
  , testCase "Loses tiebreaker" $ do
      assertEqual "a" (Just $ O.TextInsert 1 'x' 0) $ T.transform ti1 ti2 T.Left
      assertEqual "b" (Just $ O.TextInsert 1 'x' 0) $ T.transform ti1 ti2 T.Right
      assertEqual "c" (Just $ O.TextInsert 1 'x' 0) $ T.transform ti1 ti3 T.Left
  , testCase "Not affected" $ do
      assertEqual "a" (Just ti1) $ T.transform ti1 ti4 T.Left
      assertEqual "b" (Just ti1) $ T.transform ti1 ti4 T.Right
  , testCase "Index incremented" $ do
      assertEqual "a" (Just $ O.TextInsert 2 '_' 10) $ T.transform ti4 ti1 T.Left
      assertEqual "b" (Just $ O.TextInsert 2 '_' 10) $ T.transform ti4 ti1 T.Right
  ]