|
module babybearparser.Testing
open FParsec
open Microsoft.VisualStudio.TestTools.UnitTesting
open System
open babybearparser.Parser
let equals actual expected = Assert.IsTrue ((actual = expected), sprintf "%+A <> %+A" actual expected)
let throwsParseError (f: unit -> unit) contains =
try
f(); Assert.Fail ("throws: no exception thrown of type ParseError")
with
| :? ParseError as ex -> Assert.IsTrue (ex.Message.Contains(contains), sprintf "%O does not contain %s" ex contains)
[<TestClass>]
type public Tests () =
(* Tests that testing works *)
[<TestMethod>]
member this.TestsWorking() =
equals 1 1
[<TestMethod>]
member this.TestsKeywords() =
equals (parse "foo bar") [KeywordAtom <| Word "foo"; KeywordAtom <| Word "bar"]
[<TestMethod>]
member this.TestsEmpty() =
equals (List.length <| parse "") 0
[<TestMethod>]
member this.TestsPhrase() =
equals (parse "\"foo \\\" bar\"") [KeywordAtom <| Phrase "foo \" bar"]
[<TestMethod>]
member this.TestsPhraseAndKeyword() =
equals (parse "\"foo bar\" boo") [KeywordAtom <| Phrase "foo bar"; KeywordAtom <| Word "boo"]
[<TestMethod>]
member this.TestsFilter() =
equals (parse "\"foo bar\" project:boo") [KeywordAtom <| Phrase "foo bar"; FilterAtom <| Project "boo"]
[<TestMethod>]
member this.TestsFilters() =
equals (parse "\"foo bar\" project:boo repo:radley") [KeywordAtom <| Phrase "foo bar"; FilterAtom <| Project "boo"; FilterAtom <| Repo "radley"]
[<TestMethod>]
member this.TestsFilterPhrase() =
equals (parse "\"foo bar\" project:\"boo radley\"") [KeywordAtom <| Phrase "foo bar"; FilterAtom <| Project "boo radley"]
[<TestMethod>]
member this.TestsEmptyFilter() =
equals (parse "\"foo bar\" project:\"\"") [KeywordAtom <| Phrase "foo bar"; FilterAtom <| Project ""]
[<TestMethod>]
member this.TestsConfusingFilter() =
equals (parse ":taft:") [KeywordAtom <| Word ":taft:"]
[<TestMethod>]
member this.TestsMissingFilter() =
let f () = parse "\"foo bar\" project:" |> ignore
throwsParseError f "filter argument"
[<TestMethod>]
member this.TestsUnknownFilter() =
equals (parse "unknown:careless") [KeywordAtom <| Word "unknown:careless"]
[<TestMethod>]
member this.TestsDateRange() =
equals (parse "date:yesterday..today") [(DateTime.UtcNow.Date.AddDays(-1.), DateTime.UtcNow.Date) |> Date |> FilterAtom]
[<TestMethod>]
member this.TestsDateRange2() =
equals (parse "date:yesterday..2008-05-01") [(DateTime.UtcNow.Date.AddDays(-1.), DateTime.Parse("2008-05-01")) |> Date |> FilterAtom]
[<TestMethod>]
member this.TestsDateRangeMissingEnd() =
equals (parse "date:yesterday.. eggs") [(DateTime.UtcNow.Date.AddDays(-1.), DateTime.UtcNow.Date) |> Date |> FilterAtom; KeywordAtom <| Word "eggs"]
[<TestMethod>]
member this.TestsDateRangeMissingStart() =
equals (parse "date:..today eggs") [(DateTime.MinValue, DateTime.UtcNow.Date) |> Date |> FilterAtom; KeywordAtom <| Word "eggs"]
[<TestMethod>]
member this.TestsDateRangeMissingEverything() =
equals (parse "date:.. eggs") [(DateTime.MinValue, DateTime.UtcNow.Date) |> Date |> FilterAtom; KeywordAtom <| Word "eggs"]
[<TestMethod>]
member this.TestsInvalidDate() =
let f () = parse "date:\"many moons ago\"..today eggs" |> ignore
throwsParseError f "Unrecognized date"
[<TestMethod>]
member this.TestsFilterAlternation() =
equals (parse "projects") [KeywordAtom <| Word "projects"]
[<TestMethod>]
member this.TestsFilterAlternation2() =
equals (parse "proj") [KeywordAtom <| Word "proj"]
[<TestMethod>]
member this.TestsEmptyFilter2() =
let f () = parse "project:" |> ignore
throwsParseError f "filter argument"
|
Loading...