package gs.predicate.v0.kv import cats.effect.IO import cats.effect.std.MapRef import gs.datagen.v0.Gen import gs.datagen.v0.generators.Size import gs.predicate.v0.api.Predicate import support.IOSuite class ValueNotEqualsTests extends IOSuite: import ValueNotEqualsTests.Data iotest("should NOT find an exact match against some value") { ValueNotEqualsTests.newProvider(Data.KeyValues).flatMap { provider => given KeyValueProvider[IO] = provider val p = ValueNotEquals[IO](Data.ExistingKey, Data.ExistingValue) for result <- p.eval() yield assertEquals(result, Predicate.Result.missed()) } } iotest("should match a value if that value is not equal to the target") { ValueNotEqualsTests.newProvider(Data.KeyValues).flatMap { provider => given KeyValueProvider[IO] = provider val p = ValueNotEquals[IO]( Data.ExistingKey, Data.NotExistingValue ) for result <- p.eval() yield assertEquals(result, Predicate.Result.matched()) } } iotest("should not find a key that does not exist within some provider") { ValueNotEqualsTests.newProvider(Data.KeyValues).flatMap { provider => given KeyValueProvider[IO] = provider val p = ValueNotEquals[IO](Data.NotExistingKey, "") for result <- p.eval() yield assertEquals(result, Predicate.Result.missed()) } } object ValueNotEqualsTests: object Data: val ExistingKey: String = Gen.string.alphaNumeric(Size.Fixed(8)).gen() val NotExistingKey: String = Gen.string.alphaNumeric(Size.Fixed(6)).gen() val ExistingValue: String = Gen.string.alphaNumeric(Size.Fixed(10)).gen() val NotExistingValue: String = Gen.string.alphaNumeric(Size.Fixed(4)).gen() val KeyValues: Map[String, String] = Map(ExistingKey -> ExistingValue) end Data def newProvider(data: Map[String, String]): IO[KeyValueProvider[IO]] = for map <- MapRef.ofSingleImmutableMap[IO, String, String](data) yield new MemoryMapKeyValueProvider(map) end ValueNotEqualsTests