124 lines
3.5 KiB
Standard ML
124 lines
3.5 KiB
Standard ML
structure RegexTests =
|
|
struct
|
|
open Railroad
|
|
open Railroad.Test
|
|
|
|
structure CiDfa = CaseInsensitiveDfa
|
|
structure CsDfa = CaseSensitiveDfa
|
|
|
|
val caseInsensitiveTests = describe "case insensitive regex"
|
|
[ test "recognises word 'hello' in string 'Hello world'" (fn _ =>
|
|
let
|
|
(* arrange *)
|
|
val regexString = "hello"
|
|
val dfa = CiDfa.fromString regexString
|
|
val inputString = "Hello world"
|
|
|
|
(* act *)
|
|
val matches = CiDfa.matchString (dfa, inputString)
|
|
|
|
(* assert *)
|
|
val expectedMatches = [(0, 4)]
|
|
in
|
|
Expect.isTrue (matches = expectedMatches)
|
|
end)
|
|
, test "recognises word 'world' in string 'HELLO WORLD'" (fn _ =>
|
|
let
|
|
(* arrange *)
|
|
val regexString = "world"
|
|
val dfa = CiDfa.fromString regexString
|
|
val inputString = "HELLO WORLD"
|
|
|
|
(* act *)
|
|
val matches = CiDfa.matchString (dfa, inputString)
|
|
|
|
(* assert *)
|
|
val expectedMatches = [(6, 10)]
|
|
in
|
|
Expect.isTrue (matches = expectedMatches)
|
|
end)
|
|
]
|
|
|
|
val caseSensitiveTests = describe "case sensitive regex"
|
|
[ test "does not recognise word 'hello' in string 'Hello world'" (fn _ =>
|
|
let
|
|
(* arrange *)
|
|
val regexString = "hello"
|
|
val dfa = CsDfa.fromString regexString
|
|
val inputString = "Hello world"
|
|
|
|
(* act *)
|
|
val matches = CsDfa.matchString (dfa, inputString)
|
|
|
|
(* assert *)
|
|
val expectedMatches = []
|
|
in
|
|
Expect.isTrue (matches = expectedMatches)
|
|
end)
|
|
, test "recognises word 'Hello' in string 'Hello world'" (fn _ =>
|
|
let
|
|
(* arrange *)
|
|
val regexString = "Hello"
|
|
val dfa = CsDfa.fromString regexString
|
|
val inputString = "Hello world"
|
|
|
|
(* act *)
|
|
val matches = CsDfa.matchString (dfa, inputString)
|
|
|
|
(* assert *)
|
|
val expectedMatches = [(0, 4)]
|
|
in
|
|
Expect.isTrue (matches = expectedMatches)
|
|
end)
|
|
, test "does not recognise word 'world' in string 'HELLO WORLD'" (fn _ =>
|
|
let
|
|
(* arrange *)
|
|
val regexString = "world"
|
|
val dfa = CsDfa.fromString regexString
|
|
val inputString = "HELLO WORLD"
|
|
|
|
(* act *)
|
|
val matches = CsDfa.matchString (dfa, inputString)
|
|
|
|
(* assert *)
|
|
val expectedMatches = []
|
|
in
|
|
Expect.isTrue (matches = expectedMatches)
|
|
end)
|
|
, test "recognises word 'WORLD' in string 'HELLO WORLD'" (fn _ =>
|
|
let
|
|
(* arrange *)
|
|
val regexString = "WORLD"
|
|
val dfa = CsDfa.fromString regexString
|
|
val inputString = "HELLO WORLD"
|
|
|
|
(* act *)
|
|
val matches = CsDfa.matchString (dfa, inputString)
|
|
|
|
(* assert *)
|
|
val expectedMatches = [(6, 10)]
|
|
in
|
|
Expect.isTrue (matches = expectedMatches)
|
|
end)
|
|
]
|
|
|
|
val endMarkerTests = describe "regex endMarker"
|
|
[test "returns an empty DFA when regexString contains endMarker" (fn _ =>
|
|
let
|
|
(* arrange *)
|
|
(* the end marker is #"\^@" *)
|
|
val regexString = "hello \^@ world"
|
|
|
|
(* act *)
|
|
val dfa = CsDfa.fromString regexString
|
|
|
|
(* assert *)
|
|
val actualLength = Vector.length dfa
|
|
val expectedLength = 0
|
|
in
|
|
Expect.isTrue (actualLength = expectedLength)
|
|
end)]
|
|
|
|
val tests = [caseInsensitiveTests, caseSensitiveTests, endMarkerTests]
|
|
end
|