Skip to content

Commit

Permalink
doAssertRaises improvements; nimscript supports `except Exception as …
Browse files Browse the repository at this point in the history
…e` (nim-lang#15765)

* doAssertRaises now correctly handles foreign exceptions; now shows which exception is raised on mismatch
* nimscript now handles `Exception as e`
* remove catch-all doAssertRaises overload from this PR

Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
  • Loading branch information
2 people authored and ardek66 committed Mar 26, 2021
1 parent 91c280f commit 2c00a17
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 11 deletions.
3 changes: 2 additions & 1 deletion changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,11 @@
- Removed deprecated `iup` module from stdlib, it has already moved to
[nimble](https://github.com/nim-lang/iup).


- `doAssertRaises` now correctly handles foreign exceptions.

## Language changes

- `nimscript` now handles `except Exception as e`
- The `cstring` doesn't support `[]=` operator in JS backend.


Expand Down
3 changes: 2 additions & 1 deletion lib/system.nim
Original file line number Diff line number Diff line change
Expand Up @@ -2360,7 +2360,8 @@ when notJSnotNims and hostOS != "standalone":
##
## **Warning**: Only use this if you know what you are doing.
currException = exc

elif defined(nimscript):
proc getCurrentException*(): ref Exception {.compilerRtl.} = discard

when notJSnotNims:
{.push stackTrace: off, profiler: off.}
Expand Down
19 changes: 10 additions & 9 deletions lib/system/assertions.nim
Original file line number Diff line number Diff line change
Expand Up @@ -81,30 +81,31 @@ template onFailedAssert*(msg, code: untyped): untyped {.dirty.} =
code

template doAssertRaises*(exception: typedesc, code: untyped) =
## Raises ``AssertionDefect`` if specified ``code`` does not raise the
## specified exception. Example:
## Raises ``AssertionDefect`` if specified ``code`` does not raise `exception`.
## Example:
##
## .. code-block:: nim
## doAssertRaises(ValueError):
## raise newException(ValueError, "Hello World")
var wrong = false
const begin = "expected raising '" & astToStr(exception) & "', instead"
const msgEnd = " by: " & astToStr(code)
template raisedForeign = raiseAssert(begin & " raised foreign exception" & msgEnd)
when Exception is exception:
try:
if true:
code
wrong = true
except Exception:
discard
except Exception as e: discard
except: raisedForeign()
else:
try:
if true:
code
wrong = true
except exception:
discard
except Exception:
raiseAssert(astToStr(exception) &
" wasn't raised, another error was raised instead by:\n"&
astToStr(code))
except Exception as e: raiseAssert(begin & " raised '" & $e.name & "'" & msgEnd)
except: raisedForeign()
if wrong:
raiseAssert(astToStr(exception) & " wasn't raised by:\n" & astToStr(code))
raiseAssert(begin & " nothing was raised" & msgEnd)
6 changes: 6 additions & 0 deletions tests/test_nimscript.nims
Original file line number Diff line number Diff line change
Expand Up @@ -81,3 +81,9 @@ block: # #14142
discard dirExists("/usr")
discard fileExists("/usr/foo")
discard findExe("nim")

block:
doAssertRaises(AssertionDefect): doAssert false
try: doAssert false
except Exception as e:
discard

0 comments on commit 2c00a17

Please sign in to comment.