Skip to content

Are too many objects Patterns? #183

@apblack

Description

@apblack

I wrote this in a test:

assert {allEven [1, 2, 3]} shouldRaise "TypeError" mentioning "does not have type List”

and got the following failure message:

wrong type: code raised exception TypeError: "argument to request of `allEven(_)` 
does not have type List. ..." instead of TypeError

This confused me: why was a TypeError not being recognized as a TypeError? It took me quite a long time to notice that I had written “TypeError” rather than TypeError, i.e, I had used a string rather than an ExceptionKind.

So, I though: I can stop that from happening again. All I need do is to annotate the assert (_) shouldRaise(_)... method in gUnit with the type ExceptionKind. I did this, and the test now failed, complaining that the wrong type of argument was provided to assert(_)shouldRaise(_)

Unfortunately, a few other tests also failed. For example:

testDictionaryRemove5: TypeError: argument 2 in request of
`assert(_)shouldRaise(_)mentioning(_)and(_)` does not have type ExceptionKind. 
It is an OrPattern.new(_,_) (defined in module standardGrace, line 88), which is missing
methods parent, raise(_), raise(_)with(_), and refine(_). 

The test in question is written like this:

        assert {evens.removeKey 5} shouldRaise (NoSuchObject | TypeError)
        // TypeError if the type parameters are checked, NoSuchObejct otherwise

Nothing wrong with that test. Obviously, this was my mistake; I need to annotate the shouldRaise parameter with Pattern, not ExceptionKind.

Unfortunately, that doesn’t help, because a string is a Pattern, and my original error is no longer caught. Indeed, all the primitive objects are patterns. I can't think of a type annotation that would catch this error.

Is this a design issue with Patterns?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions