All Downloads are FREE. Search and download functionalities are using the official Maven repository.

kantan.codecs.enumeratum.laws.discipline.arbitrary.scala Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2016 Nicolas Rinaudo
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package kantan.codecs.enumeratum.laws.discipline

import enumeratum.values._
import kantan.codecs.laws.CodecValue.IllegalValue
import kantan.codecs.laws.CodecValue.LegalValue
import kantan.codecs.laws.IllegalString
import kantan.codecs.laws.LegalString
import kantan.codecs.strings.StringEncoder
import kantan.codecs.strings.codecs
import org.scalacheck.Arbitrary
import org.scalacheck.Arbitrary.{arbitrary => arb}
import org.scalacheck.Gen

object arbitrary extends ArbitraryInstances with kantan.codecs.laws.discipline.ArbitraryInstances

trait ArbitraryInstances
    extends _root_.enumeratum.ScalacheckInstances with _root_.enumeratum.values.ScalacheckInstances {

  // - Enumerated instances --------------------------------------------------------------------------------------------
  // -------------------------------------------------------------------------------------------------------------------

  implicit val arbLegalEnumerated: Arbitrary[LegalString[Enumerated]] =
    Arbitrary(Gen.oneOf(Enumerated.values.map(v => LegalValue[String, Enumerated, codecs.type](v.entryName, v))))

  implicit val arbIllegalEnumerated: Arbitrary[IllegalString[Enumerated]] = {
    val legal = Enumerated.values.map(_.entryName)
    Arbitrary(arb[String].suchThat(s => !legal.contains(s)).map(s => IllegalValue(s)))
  }

  // - EnumeratedValue instances ---------------------------------------------------------------------------------------
  // -------------------------------------------------------------------------------------------------------------------

  def arbLegalEnumeratedValue[V: StringEncoder, A <: ValueEnumEntry[V]](
    valueEnum: ValueEnum[V, A]
  ): Arbitrary[LegalString[A]] =
    Arbitrary(
      Gen.oneOf(
        valueEnum.values.map(v => LegalValue[String, A, codecs.type](StringEncoder[V].encode(v.value), v))
      )
    )

  def arbIllegalEnumeratedValue[V: StringEncoder, A <: ValueEnumEntry[V]](
    valueEnum: ValueEnum[V, A]
  ): Arbitrary[IllegalValue[String, A, codecs.type]] = {
    val legal = valueEnum.values.map(a => StringEncoder[V].encode(a.value))
    Arbitrary {
      arb[String].suchThat(s => !legal.contains(s)).map(s => IllegalValue(s))
    }
  }

  implicit val arbLegalEnumeratedInt: Arbitrary[LegalString[EnumeratedInt]] =
    arbLegalEnumeratedValue(EnumeratedInt)

  implicit val arbIllegalEnumeratedInt: Arbitrary[IllegalString[EnumeratedInt]] =
    arbIllegalEnumeratedValue(EnumeratedInt)

  implicit val arbLegalEnumeratedLong: Arbitrary[LegalString[EnumeratedLong]] =
    arbLegalEnumeratedValue(EnumeratedLong)

  implicit val arbIllegalEnumeratedLong: Arbitrary[IllegalString[EnumeratedLong]] =
    arbIllegalEnumeratedValue(EnumeratedLong)

  implicit val arbLegalEnumeratedShort: Arbitrary[LegalString[EnumeratedShort]] =
    arbLegalEnumeratedValue(EnumeratedShort)

  implicit val arbIllegalEnumeratedShort: Arbitrary[IllegalString[EnumeratedShort]] =
    arbIllegalEnumeratedValue(EnumeratedShort)

  implicit val arbLegalEnumeratedString: Arbitrary[LegalString[EnumeratedString]] =
    arbLegalEnumeratedValue(EnumeratedString)

  implicit val arbIllegalEnumeratedString: Arbitrary[IllegalString[EnumeratedString]] =
    arbIllegalEnumeratedValue(EnumeratedString)

  implicit val arbLegalEnumeratedByte: Arbitrary[LegalString[EnumeratedByte]] =
    arbLegalEnumeratedValue(EnumeratedByte)

  implicit val arbIllegalEnumeratedByte: Arbitrary[IllegalString[EnumeratedByte]] =
    arbIllegalEnumeratedValue(EnumeratedByte)

  implicit val arbLegalEnumeratedChar: Arbitrary[LegalString[EnumeratedChar]] =
    arbLegalEnumeratedValue(EnumeratedChar)

  implicit val arbIllegalEnumeratedChar: Arbitrary[IllegalString[EnumeratedChar]] =
    arbIllegalEnumeratedValue(EnumeratedChar)

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy