content: module Migrate where
  
  -- base
  import Data.Data (dataTypeName, isAlgType)
  
  -- QuickCheck
  import Test.QuickCheck.Property ((===))
  
  -- test-framework
  import Test.Framework
  
  -- test-framework-quickcheck2
  import Test.Framework.Providers.QuickCheck2 (testProperty)
  
  -- essence-of-live-coding
  import LiveCoding (Data (dataTypeOf), castMigration, runSafeMigration)
  import LiveCoding.Migrate
  
  import Migrate.NoMigration
  import qualified TestData.Foo1 as Foo1
  import qualified TestData.Foo2 as Foo2
  
  test =
    testGroup
      "Migrate"
      [ testGroup
          "Internal assumptions"
          [ testGroup
              "matchingAlgebraicDataTypes"
              [ testProperty "True for types with the same name" $
                  matchingAlgebraicDataTypes Foo1.foo Foo2.foo
              , testGroup
                  "debugging tests"
                  [ testProperty "isAlgType" $ isAlgType $ dataTypeOf Foo1.foo
                  ]
              ]
          ]
      , testGroup
          "standard migrations"
          [ testGroup
              "castMigration"
              [ testProperty "Migrates for same data type" $
                  runSafeMigration castMigration Foo1.same Foo1.same
                    == Foo1.same
              , testProperty "Does not migrate for different data types" $
                  runSafeMigration castMigration Foo1.same Foo2.same
                    == Foo1.same
              , testProperty "Migrates for same builtin type" $
                  runSafeMigration castMigration (23 :: Int) (42 :: Int)
                    == 42
              , testProperty "Does not migrate for different builtin types" $
                  runSafeMigration castMigration (23 :: Int) (42 :: Integer)
                    == 23
              ]
          , testGroup
              "sameConstructorMigration"
              [ testProperty "Migrates when constructor names and arity match" $
                  runSafeMigration (sameConstructorMigration castMigration) Foo1.same Foo2.same
                    == Foo1.same'
              , testProperty "Migrates for same data type" $
                  runSafeMigration (sameConstructorMigration castMigration) Foo1.same Foo1.same'
                    == Foo1.same'
              ]
          ]
      , Migrate.NoMigration.test
      ]
  