Persimmon の暫定的な assertSeqEquals を書いてみた
(* | |
* The MIT License (MIT) | |
* | |
* Copyright (c) 2016 Kazuhiro Matsushima | |
* | |
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the | |
* Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, | |
* and to permit persons to whom the Software is furnished to do so, subject to the following conditions: | |
* | |
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. | |
* | |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR | |
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH | |
* THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
*) | |
[<AutoOpen>] | |
module PersimmonExperimental = | |
let assertSeqEquals (expected: seq<'T>) (actual: seq<'T>) = | |
let eLen = Seq.length expected | |
let aLen = Seq.length actual | |
let violated message = AssertionResult.NotPassed(NotPassedCause.Violated message) | |
if eLen <> aLen | |
then violated <| sprintf "%A ≠ %A\nExpect: length is %d\nActual: length is %d" expected actual eLen aLen | |
else | |
let result = | |
(expected, actual) | |
||> Seq.zip | |
|> Seq.map (fun (e, a) -> (e, a, e <> a)) | |
|> Seq.tryFind (fun (_, _, b) -> b) | |
match result with | |
| Some (e, a, _) -> | |
violated <| sprintf "%A ≠ %A\nExpect: %A\nActual: %A" expected actual e a | |
| None -> AssertionResult.Passed() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment