Kiln » babybearparser
Clone URL:  
Pushed to one repository · View In Graph Contained in tip

Better exception and exception handling.

Changeset c381bb2b7e39

Parent 876e4bb434dc

by Profile picture of User 138Hao Lian <hao@fogcreek.com>

Changes to 2 files · Browse files at c381bb2b7e39 Showing diff from parent 876e4bb434dc Diff from another changeset...

 
5
6
7
8
9
10
11
12
13
14
15
 
19
20
21
22
23
24
25
26
27
28
 
 
29
30
31
 
41
42
43
44
 
45
46
47
 
5
6
7
 
 
 
 
 
8
9
10
 
14
15
16
 
 
 
 
 
17
 
18
19
20
21
22
 
32
33
34
 
35
36
37
38
@@ -5,11 +5,6 @@
 open System    type Keyword = Word of string | Phrase of string - with - override this.ToString() = - match this with - | Word s -> String.Format("Word<{0}>", s) - | Phrase s -> String.Format("Phrase<{0}>", s)    type Filter =   | Author of string @@ -19,13 +14,9 @@
  | Repo of string    type Atom = KeywordAtom of Keyword | FilterAtom of Filter - with - override this.ToString() = - match this with - | KeywordAtom k -> String.Format("KeywordAtom<{0}>", k) - | FilterAtom f -> String.Format("FilterAtom<{0}>", f)   -exception ParseError of string +type ParseError (msg: string) = + inherit Exception (msg)    (* Utilities *)  let pipeline (f, a) = f a @@ -41,7 +32,7 @@
  | "file" -> File   | "project" -> Project   | "repo" -> Repo - | _ -> raise <| Exception "Invalid filter name" + | _ -> raise <| ParseError "Invalid filter name"    (* Parsers *)  let word = many1Satisfy <| fun c -> c <> ' '
1
2
3
4
5
6
7
8
9
 
 
10
11
12
13
14
 
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
1
2
3
4
5
6
7
8
 
9
10
11
12
13
14
 
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
 module babybearparser.Testing    open FParsec  open Microsoft.VisualStudio.TestTools.UnitTesting  open System    open babybearparser.Parser   -let equals actual expected = Assert.IsTrue ((actual = expected), String.Format("{0} <> {1}", actual, expected)) +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(x) -> Assert.IsTrue (x.Contains(contains), String.Format("{0} does not contain {1}", x, contains)) + | :? 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"