Skip to content

Add NumberResolver for kotlin.Number type #45

Description

@MessiasLima

Description

Add a NumberResolver that handles kotlin.Number so that some<Number>() returns a random concrete numeric value instead of throwing SomeUnresolvableTypeException.

Number is abstract and cannot be instantiated directly. The resolver should randomly select one of the concrete numeric subtypes (e.g., Int, Long, Double, Float, Short, Byte) and delegate resolution to the existing resolver chain.

  • Scope and constraints

    • In scope: NumberResolver class, unit tests, registration in SomeConfig.buildResolvers()
    • Out of scope: BigInteger, BigDecimal, and AtomicInteger/AtomicLong are not kotlin.Number subtypes and remain handled by their own resolvers
    • Must be registered after all concrete numeric resolvers in the chain (first-match-wins means concrete types like Int must match before Number)
    • Must use type == typeOf<Number>() for exact type matching, not toString().contains()
  • References

    • Follows the same pattern as existing numeric resolvers (IntResolver, LongResolver, etc.)

Scope

  • Create NumberResolver.kt in dev.appoutlet.some.resolver
  • Create NumberResolverTest.kt in dev.appoutlet.some.resolver
  • Register NumberResolver in SomeConfig.buildResolvers() after ShortResolver and before KotlinUuidResolver

Acceptance criteria

  • some<Number>() returns a value that is an instance of kotlin.Number (one of Int, Long, Double, Float, Short, Byte)
  • NumberResolver.canResolve(typeOf<Number>()) returns true
  • NumberResolver.canResolve() returns false for concrete numeric types (Int, Long, Double, etc.) — those are handled by their own resolvers
  • NumberResolver is registered in SomeConfig after all concrete numeric resolvers
  • Unit tests follow the standard 3-test pattern: generation, positive detection, negative rejection
  • ./gradlew test passes

Additional information

Since Number is abstract, the resolver should randomly pick a concrete numeric subtype and delegate to the ResolverChain (e.g., chain.resolve(typeOf<Int>())) rather than generating values directly. This keeps the resolver consistent with the chain pattern and ensures any user-registered custom factories for numeric types are respected.

Metadata

Metadata

Assignees

No one assigned

    Labels

    julesJules lives

    Projects

    Status
    Done

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions