-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathregex_test.cljc
More file actions
194 lines (180 loc) · 10.1 KB
/
regex_test.cljc
File metadata and controls
194 lines (180 loc) · 10.1 KB
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
(ns xapi-schema.spec.regex-test
(:require
[clojure.test :refer [deftest is testing] :include-macros true]
[xapi-schema.spec.regex :refer [LanguageTagRegEx
AbsoluteIRIRegEx
RelativeIRLRegEx
AbsoluteURIRegEx
RelativeURLRegEx
MailToIRIRegEx
UuidRegEx
TimestampRegEx
TimestampRegEx200
xAPIVersionRegEx
xAPIVersionRegEx200
DurationRegEx
Base64RegEx
Sha1RegEx
Sha2RegEx
OpenIdRegEx]]))
(deftest language-tag-regex-test
(testing "matches valid Language Tags"
(is (re-matches LanguageTagRegEx "en"))
(is (re-matches LanguageTagRegEx "arb"))
(is (re-matches LanguageTagRegEx "en-US")) ; lang + region
(is (re-matches LanguageTagRegEx "es-419")) ; lang + region code
(is (re-matches LanguageTagRegEx "zh-yue")) ; lang + extlang
(is (re-matches LanguageTagRegEx "uz-Arab")) ; lang + script
(is (re-matches LanguageTagRegEx "zh-cmn-Latn-CN")) ; lang + extension + region
(is (re-matches LanguageTagRegEx "zh-Latn-CN-pinyin")) ; lang + script + region + variant
(is (re-matches LanguageTagRegEx "de-DE-u-co-phonebk")) ; lang + region + extension
(is (re-matches LanguageTagRegEx "en-US-x-twain")) ; lang + region + private
(is (re-matches LanguageTagRegEx "sl-rozaj-biske")) ; lang + variant
(is (re-matches LanguageTagRegEx "de-CH-1901")) ; lang + region + variant
(is (re-matches LanguageTagRegEx "i-enochian")) ; grandfathered tag
(is (re-matches LanguageTagRegEx "foo")) ; doesn't check if tag is registered
(is (not (re-matches LanguageTagRegEx "not a language tag")))
(is (not (re-matches LanguageTagRegEx "en-")))
(is (not (re-matches LanguageTagRegEx "de-419-DE"))) ; two region tags
(is (not (re-matches LanguageTagRegEx "a-DE")))
(is (not (re-matches LanguageTagRegEx "fr-u-o")))
(is (not (re-matches LanguageTagRegEx "americanenglish")))))
(deftest open-id-regex-test
(testing "matches valid URIs"
(is (re-matches OpenIdRegEx "http://www.foo.com"))
(is (not (re-matches OpenIdRegEx "www.foo.com")))
(is (not (re-matches OpenIdRegEx "foo.com")))
(is (not (re-matches OpenIdRegEx "hey dude wat")))
(is (not (re-matches OpenIdRegEx "custom://www.foo.com"))))
(testing "matches URIs with fragments"
(is (re-matches OpenIdRegEx "http://example.com/xapi/verbs#sent-a-statement"))))
(deftest absolute-iri-regex-test
(testing "matches valid absolute IRIs"
(is (re-matches AbsoluteIRIRegEx "http://foo.com"))
(is (not (re-matches AbsoluteIRIRegEx "foo.com")))
(is (not (re-matches AbsoluteIRIRegEx "www.foo.com")))
;; See issue 17 https://github.com/yetanalytics/xapi-schema/issues/17
(is (re-matches AbsoluteIRIRegEx "foo:/a"))
(is (re-matches AbsoluteIRIRegEx "foo+bar.baz-quxx:/a"))
(is (re-matches AbsoluteIRIRegEx "reallydamnlongschemeoverhere://foo.bar")))
(testing "matches IRIs with fragments"
(is (re-matches AbsoluteIRIRegEx "http://example.com/xapi/verbs#sent-a-statement"))
(is (re-matches AbsoluteIRIRegEx "http://example.com/xapi/foo/#bar?my_jimmies=rustled"))
(is (re-matches AbsoluteIRIRegEx "http://a_b/#foo"))
(is (re-matches AbsoluteIRIRegEx "https://foo-baz.app.com/xapi/def/emb/qux*ROOT"))
(is (re-matches AbsoluteIRIRegEx "https://foo-baz.app.com/xapi#foo:bar")))
(testing "matches IRIs with URL encodings"
(is (re-matches AbsoluteIRIRegEx "http://cenariovr.com/174/Sharks!/sharks-Type%20of%20Shark"))
(is (re-matches AbsoluteIRIRegEx "http://cenar%20iovr.com/1%2074/S%20harks!/shark%20s-Type%20of%20Shark")))
(testing "matches IRIs with Unicode characters"
(is (re-matches AbsoluteIRIRegEx "https://en.wiktionary.org/wiki/Ῥόδος"))
(is (re-matches AbsoluteIRIRegEx "https://www.你好世界.cn"))
(is (re-matches AbsoluteIRIRegEx "https://www.example.kr#안녕하세요")))
(testing "matches IRIs with absolute and rootless paths"
(is (re-matches AbsoluteIRIRegEx "https:/foo/bar"))
(is (re-matches AbsoluteIRIRegEx "urn:example:animal:ferret:nose"))))
(deftest relative-irl-regex-test
(testing "matches valid relative IRLs"
(is (re-matches RelativeIRLRegEx "/"))
(is (re-matches RelativeIRLRegEx "/xapi"))
(is (not (re-matches RelativeIRLRegEx "https://foo.com")))
(is (not (re-matches RelativeIRLRegEx "www.foo.com"))))
(testing "matches relative IRLs with fragments"
(is (re-matches RelativeIRLRegEx "/xapi/verbs#sent-a-statement"))
(is (re-matches RelativeIRLRegEx "/xapi/foo/#bar?my_jimmies=rustled"))
(is (re-matches RelativeIRLRegEx "/#foo"))
(is (re-matches RelativeIRLRegEx "/xapi/def/emb/qux*ROOT"))
(is (re-matches RelativeIRLRegEx "/xapi#foo:bar")))
(testing "matches relative IRLs with Unicode characters"
(is (re-matches RelativeIRLRegEx "/wiki/Ῥόδος")))
(testing "does not match network path and no-scheme relative IRLs"
(is (not (re-matches RelativeIRLRegEx "./this:that")))
(is (not (re-matches RelativeIRLRegEx "foo")))
(is (not (re-matches RelativeIRLRegEx "//foo.com/bar")))))
(deftest absolute-uri-regex-test
(testing "matches valid absolute URIs"
(is (re-matches AbsoluteURIRegEx "http://foo.com"))
(is (re-matches AbsoluteURIRegEx "http://cenariovr.com/174/Sharks!/sharks-Type%20of%20Shark"))
(is (not (re-matches AbsoluteURIRegEx "https://en.wiktionary.org/wiki/Ῥόδος")))))
(deftest absolute-url-regex-test
(testing "matches valid relative URLs"
(is (re-matches RelativeURLRegEx "/"))
(is (re-matches RelativeURLRegEx "/#foo"))
(is (not (re-matches RelativeURLRegEx "/wiki/Ῥόδος")))))
(deftest mailto-iri-regex-test
(testing "matches valid mailto IRIs"
(is (re-matches MailToIRIRegEx "mailto:milt@yetanalytics.com"))
(is (not (re-matches MailToIRIRegEx "http://foo.com")))
(is (not (re-matches MailToIRIRegEx "milt@yetanalytics.com")))
(is (not (re-matches MailToIRIRegEx "mi%lt@yetanalytics.com")))
(is (re-matches MailToIRIRegEx "mailto:mi%0Alt@yetanalytics.com"))
(is (re-matches MailToIRIRegEx "mailto:foo-baz.@some-domain.com"))
;; International email addresses are not yet supported
(is (not (re-matches MailToIRIRegEx "mailto:你好世界@Ῥόδος.com")))))
(deftest uuid-regex-test
(testing "matches valid 4.0 UUIDs"
(is (re-matches UuidRegEx "f47ac10b-58cc-4372-a567-0e02b2c3d479"))
(is (re-matches UuidRegEx "f47ac10b-58cc-4372-0567-0e02b2c3d479"))
(is (not (re-matches UuidRegEx "1234-1234-1234-1234")))
(is (not (re-matches UuidRegEx "3c7db14d-ac4b-4e35-b2c6-3b2237f382")))
(is (not (re-matches UuidRegEx "MA97B177-9383-4934-8543-0F91A7A02836"))))
(testing "matches all UUID versions"
(is (re-matches UuidRegEx "f47ac10b-58cc-1372-0567-0e02b2c3d479"))
(is (re-matches UuidRegEx "f47ac10b-58cc-2372-0567-0e02b2c3d479"))
(is (re-matches UuidRegEx "f47ac10b-58cc-3372-0567-0e02b2c3d479"))
(is (re-matches UuidRegEx "f47ac10b-58cc-4372-0567-0e02b2c3d479"))
(is (re-matches UuidRegEx "f47ac10b-58cc-5372-0567-0e02b2c3d479"))
(is (re-matches UuidRegEx "f47ac10b-58cc-6372-0567-0e02b2c3d479"))
(is (re-matches UuidRegEx "f47ac10b-58cc-7372-0567-0e02b2c3d479"))
(is (re-matches UuidRegEx "f47ac10b-58cc-8372-0567-0e02b2c3d479"))))
(deftest timestamp-regex-test
(testing "matches valid ISO 8601 datetime stamps within the rfc3339 profile"
(is (re-matches TimestampRegEx "2015-05-13T15:16:00Z"))
(is (re-matches TimestampRegEx "2015-05-13T15:16:00.304Z"))
(is (re-matches TimestampRegEx "2015-05-13T15:16:00-20:00"))
(is (re-matches TimestampRegEx "2016-11-22T16:50:25.3868080Z"))
(is (re-matches TimestampRegEx "0003-06-04T12:30:05Z")) ; Duration example
(is (not (re-matches TimestampRegEx "5-13-2015")))
(is (not (re-matches TimestampRegEx "20150513T15Z")))
(is (not (re-matches TimestampRegEx "20150513T15:16:00Z")))
;; negative offset
(is (not (re-matches TimestampRegEx "2008-09-15T15:53:00.601-00:00"))))
(testing "matches valid but terrible stamps in rfc3339 OUTSIDE of 8601"
(is (re-matches TimestampRegEx200 "2015-05-13 15:16:00Z"))))
(deftest xapi-version-regex-test
(testing "matches xAPI 1.0.X versions"
(is (and (re-matches xAPIVersionRegEx "1.0.0")
(re-matches xAPIVersionRegEx "1.0.2")
(re-matches xAPIVersionRegEx "1.0")
(re-matches xAPIVersionRegEx "1.0.32-abc.def+ghi.jkl")))
(is (not (re-matches xAPIVersionRegEx "0.9.5"))))
(testing "matches xAPI 2.0.0 version only"
(is (and (re-matches xAPIVersionRegEx200 "2.0.0")
(not (re-matches xAPIVersionRegEx200 "2.0.2"))))))
(deftest duration-regex-test
(testing "matches ISO durations"
(is (re-matches DurationRegEx "P3Y6M4DT12H30M5S"))
(is (re-matches DurationRegEx "P23DT122.34S"))
(is (re-matches DurationRegEx "PT3H0M25.51S"))
(is (re-matches DurationRegEx "PT3H25.51S"))
(is (re-matches DurationRegEx "P0003-06-04T12:30:05")) ; Wikipedia example
(is (not (re-matches DurationRegEx "PT")))
(is (not (re-matches DurationRegEx "P10.3DT1.7S")))))
(deftest base64-regex-test
(testing "matches Base64 encoded stuff"
(is (re-matches
Base64RegEx
"495395e777cd98da653df9615d09c0fd6bb2f8d4788394cd53c56a3bfdcd848a"))
(is (re-matches Base64RegEx "1234abcd"))
(is (re-matches Base64RegEx "1234abc="))
(is (re-matches Base64RegEx "1234ab=="))
(is (re-matches Base64RegEx "1234////"))
(is (not (re-matches Base64RegEx "12345")))))
(deftest sha1-regex-test
(testing "matches SHA-1 hashes"
(is (re-matches Sha1RegEx "ebd31e95054c018b10727ccffd2ef2ec3a016ee9"))
(is (not (re-matches Sha1RegEx "1234")))))
(deftest sha2-regex-test
(testing "matches SHA-2 hashes"
(is (re-matches Sha2RegEx "495395e777cd98da653df9615d09c0fd6bb2f8d4788394cd53c56a3bfdcd848a"))
(is (not (re-matches Sha2RegEx "Q3lxN0R1NQ==")))))