anchor.diff:          if typeof<'a>.IsAssignableFrom(lastValueTy) then () //it's the correct exception
           else //it's not the correct exception
               try
  -                testFailed reducedExprs (sprintf "Expected %s but got %s" typeof<'a>.Name (lastValueTy.Name))
  +                testFailed reducedExprs (expectedExnButWrongExnRaisedMsg typeof<'a>.Name (lastValueTy.Name))
               with 
               | e -> raise e
       | _ -> //it's not an exception
           try
  -            testFailed reducedExprs (sprintf "Expected %s but got nothing" typeof<'a>.Name)
  +            testFailed reducedExprs (expectedExnButNoExnRaisedMsg typeof<'a>.Name)
           with 
           | e -> raise e
   
  
positive.code:             | DerivedPatterns.Bool(true) -> () //the exnWhen condition is true
              | _ ->  
                  try
                      testFailed reducedExprs (sprintf "Got the expected exception, but the exception assertion failed:\n\nException Assertion:\n\n%s\n\nTest Expression:" (exnWhenReducedExprs |> List.map decompile |> String.concat "\n"))
                  with 
                  | e -> raise e //we catch and raise e here to hide stack traces for clean test framework output
  
          else //it's not the correct exception
              try
                  testFailed reducedExprs (sprintf "Expected %s but got %s" typeof<'a>.Name (lastValueTy.Name))
              with 
              | e -> raise e
      | _ -> //it's not an exception
          try
              testFailed reducedExprs (sprintf "Expected %s but got nothing" typeof<'a>.Name)
          with 
          | e -> raise e
      
  
negative.code:         let lastExpr = reducedExprs |> List.rev |> List.head
          reducedExprs, lastExpr
  
      let inline expectedExnButWrongExnRaisedMsg ty1 ty2 = sprintf "Expected exception of type '%s', but '%s' was raised instead" ty1 ty2
      let inline expectedExnButNoExnRaisedMsg ty1 = sprintf "Expected exception of type '%s', but no exception was raised" ty1
      
  
  open Internal
  
  //making inline (together with catch/raise) ensures stacktraces clean in test framework output
  