Skip to content
This repository was archived by the owner on Jan 3, 2025. It is now read-only.
This repository was archived by the owner on Jan 3, 2025. It is now read-only.

Add custom printing of Strings to easly distinguish single digit String from Int #121

@igorwojda

Description

@igorwojda

here is a real-life scenario that made me very confused

listOf(1, 2, "fizz", 4, "buzz") shouldEqual listOf(1, 2, "fizz", 4, "buzz") //ok
listOf(1, 2, "fizz", 4, "buzz") shouldEqual listOf("1", "2", "fizz", 4, "buzz") //fail

The reason of the confusion was this error message :
java.lang.AssertionError: Expected <[1, 2, fizz, 4, buzz]>, actual <[1, 2, fizz, 4, buzz]>.

I think we should consider custom toString conversion to make distinction Int vs String more explicit for all "string prints". The code is not the best but we will get the idea:

val list = listOf(1, "2", "fizz", 4, "buzz")
        println(list) //prints: [1, 2, fizz, 4, buzz]

        println(list.joinToString(
            transform = {
                if (it is String)
                    "\"$it\""
                else
                    it.toString()
            },
            prefix = "[",
            postfix = "]"
        )) //prints: [1, "2", "fizz", 4, "buzz"]

As a result we would get much better error message giving instant hint what is wrong
Before:
java.lang.AssertionError: Expected <[1, 2, fizz, 4, buzz]>, actual <[1, 2, fizz, 4, buzz]>

After
java.lang.AssertionError: Expected <[1, 2, fizz, 4, buzz]>, actual <["1", "2", "fizz", "4", "buzz"]>

As an alternative we could consider handling in special wahy the case where test fails but actuall.toString() == expected.toString(). Then we could make decision about display more information like data types in error message.

Also, keep in mind this is a simplified example, in reality, we will have a function that returns the list making mistake harder to spot in code
listOf(1, 2, "fizz", 4, "buzz") shouldEqual getMyList() //fail

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions