-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSTDUUIDTST.m
More file actions
211 lines (211 loc) · 9.73 KB
/
STDUUIDTST.m
File metadata and controls
211 lines (211 loc) · 9.73 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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
STDUUIDTST ; Test suite for STDUUID (v0.0.1).
; m-lint: disable-file=M-MOD-020
; Test labels delegate counters by-ref to STDASSERT helpers; m-cli's
; by-ref analyzer can't see writes-via-callee.
new pass,fail
do start^STDASSERT(.pass,.fail)
;
do tV4Is36Chars(.pass,.fail)
do tV4HasCorrectHyphens(.pass,.fail)
do tV4HasVersionNibble4(.pass,.fail)
do tV4HasRfc4122Variant(.pass,.fail)
do tV4UsesLowercaseHex(.pass,.fail)
do tV4UniqueAcross200Samples(.pass,.fail)
do tV7Is36Chars(.pass,.fail)
do tV7HasCorrectHyphens(.pass,.fail)
do tV7HasVersionNibble7(.pass,.fail)
do tV7HasRfc4122Variant(.pass,.fail)
do tV7IsTimeOrdered(.pass,.fail)
do tValidAcceptsCanonicalLowercase(.pass,.fail)
do tValidAcceptsCanonicalUppercase(.pass,.fail)
do tValidAcceptsAllRfcVersions(.pass,.fail)
do tValidRejectsBadLength(.pass,.fail)
do tValidRejectsBadHyphenPositions(.pass,.fail)
do tValidRejectsNonHexCharacter(.pass,.fail)
do tValidRejectsEmpty(.pass,.fail)
do tVersionDetectsAllRfcVersions(.pass,.fail)
do tVersionReturnsEmptyForInvalid(.pass,.fail)
do tVariantClassifiesNcs(.pass,.fail)
do tVariantClassifiesRfc4122(.pass,.fail)
do tVariantClassifiesMicrosoft(.pass,.fail)
do tVariantClassifiesFuture(.pass,.fail)
do tVariantReturnsEmptyForInvalid(.pass,.fail)
;
do report^STDASSERT(pass,fail)
quit
;
tV4Is36Chars(pass,fail) ;@TEST "V4() returns a 36-char string"
new u set u=$$v4^STDUUID()
do len^STDASSERT(.pass,.fail,$length(u),36,"V4 length is 36")
quit
;
tV4HasCorrectHyphens(pass,fail) ;@TEST "V4() places hyphens at positions 9, 14, 19, 24"
new u set u=$$v4^STDUUID()
do eq^STDASSERT(.pass,.fail,$extract(u,9),"-","hyphen at 9")
do eq^STDASSERT(.pass,.fail,$extract(u,14),"-","hyphen at 14")
do eq^STDASSERT(.pass,.fail,$extract(u,19),"-","hyphen at 19")
do eq^STDASSERT(.pass,.fail,$extract(u,24),"-","hyphen at 24")
quit
;
tV4HasVersionNibble4(pass,fail) ;@TEST "V4() sets version nibble to '4' at position 15"
new u set u=$$v4^STDUUID()
do eq^STDASSERT(.pass,.fail,$extract(u,15),"4","version nibble at 15 is 4")
quit
;
tV4HasRfc4122Variant(pass,fail) ;@TEST "V4() variant nibble at position 20 is 8/9/a/b"
; sample several to make sure all four allowed values appear over time
new u,n,c
for n=1:1:50 do
. set u=$$v4^STDUUID()
. set c=$extract(u,20)
. do contains^STDASSERT(.pass,.fail,"89ab",c,"V4 variant nibble in {8,9,a,b}")
quit
;
tV4UsesLowercaseHex(pass,fail) ;@TEST "V4() emits lowercase hex (no A-F)"
new u,clean
set u=$$v4^STDUUID()
set clean=$translate(u,"-","")
; If clean has any uppercase A-F, $TRANSLATE leaves them; expect ""
do eq^STDASSERT(.pass,.fail,$translate(clean,"0123456789abcdef",""),"","lowercase hex only")
quit
;
tV4UniqueAcross200Samples(pass,fail) ;@TEST "V4() does not collide across 200 samples"
new seen,n,u,collisions
set collisions=0
for n=1:1:200 do
. set u=$$v4^STDUUID()
. if $data(seen(u)) set collisions=$increment(collisions)
. set seen(u)=""
do eq^STDASSERT(.pass,.fail,collisions,0,"no collisions over 200 V4s")
quit
;
tV7Is36Chars(pass,fail) ;@TEST "V7() returns a 36-char string"
new u set u=$$v7^STDUUID()
do len^STDASSERT(.pass,.fail,$length(u),36,"V7 length is 36")
quit
;
tV7HasCorrectHyphens(pass,fail) ;@TEST "V7() places hyphens at positions 9, 14, 19, 24"
new u set u=$$v7^STDUUID()
do eq^STDASSERT(.pass,.fail,$extract(u,9),"-","hyphen at 9")
do eq^STDASSERT(.pass,.fail,$extract(u,14),"-","hyphen at 14")
do eq^STDASSERT(.pass,.fail,$extract(u,19),"-","hyphen at 19")
do eq^STDASSERT(.pass,.fail,$extract(u,24),"-","hyphen at 24")
quit
;
tV7HasVersionNibble7(pass,fail) ;@TEST "V7() sets version nibble to '7' at position 15"
new u set u=$$v7^STDUUID()
do eq^STDASSERT(.pass,.fail,$extract(u,15),"7","version nibble at 15 is 7")
quit
;
tV7HasRfc4122Variant(pass,fail) ;@TEST "V7() variant nibble at position 20 is 8/9/a/b"
new u,n
for n=1:1:20 do
. set u=$$v7^STDUUID()
. do contains^STDASSERT(.pass,.fail,"89ab",$extract(u,20),"V7 variant nibble")
quit
;
tV7IsTimeOrdered(pass,fail) ;@TEST "V7() output sorts in generation order"
; Generate a batch with a short delay and confirm string sort matches
; generation order. The first 48 bits are ms-since-epoch, so two UUIDs
; generated in different milliseconds must sort correctly.
;
; M's "]" operator does string-collation comparison ("a]b" iff a sorts
; after b). Don't use "<": that does numeric comparison and reduces
; UUIDs to their leading numeric prefix.
new u1,u2,u3
set u1=$$v7^STDUUID()
hang 0.005
set u2=$$v7^STDUUID()
hang 0.005
set u3=$$v7^STDUUID()
do true^STDASSERT(.pass,.fail,u2]u1,"u2 sorts after u1")
do true^STDASSERT(.pass,.fail,u3]u2,"u3 sorts after u2")
quit
;
tValidAcceptsCanonicalLowercase(pass,fail) ;@TEST "valid() accepts canonical lowercase"
do true^STDASSERT(.pass,.fail,$$valid^STDUUID("550e8400-e29b-41d4-a716-446655440000"),"RFC example v4")
do true^STDASSERT(.pass,.fail,$$valid^STDUUID($$v4^STDUUID()),"freshly-minted V4 valid")
do true^STDASSERT(.pass,.fail,$$valid^STDUUID($$v7^STDUUID()),"freshly-minted V7 valid")
quit
;
tValidAcceptsCanonicalUppercase(pass,fail) ;@TEST "valid() accepts uppercase hex"
do true^STDASSERT(.pass,.fail,$$valid^STDUUID("550E8400-E29B-41D4-A716-446655440000"),"uppercase RFC example")
quit
;
tValidAcceptsAllRfcVersions(pass,fail) ;@TEST "valid() accepts versions 1-7"
; Position 15 is the version nibble; vary it across 1..7.
new base,v,n
for v=1:1:7 do
. set base="550e8400-e29b-X1d4-a716-446655440000"
. set $extract(base,15)=v
. do true^STDASSERT(.pass,.fail,$$valid^STDUUID(base),"version "_v_" valid")
quit
;
tValidRejectsBadLength(pass,fail) ;@TEST "valid() rejects wrong length"
do false^STDASSERT(.pass,.fail,$$valid^STDUUID(""),"empty")
do false^STDASSERT(.pass,.fail,$$valid^STDUUID("550e8400"),"too short")
do false^STDASSERT(.pass,.fail,$$valid^STDUUID("550e8400-e29b-41d4-a716-446655440000-extra"),"too long")
quit
;
tValidRejectsBadHyphenPositions(pass,fail) ;@TEST "valid() rejects misplaced hyphens"
do false^STDASSERT(.pass,.fail,$$valid^STDUUID("550e84000e29b-41d4-a716-446655440000"),"missing hyphen at 9")
do false^STDASSERT(.pass,.fail,$$valid^STDUUID("550-e8400-e29b-41d4-a716-46655440000"),"hyphen at 4")
quit
;
tValidRejectsNonHexCharacter(pass,fail) ;@TEST "valid() rejects non-hex chars"
do false^STDASSERT(.pass,.fail,$$valid^STDUUID("550e8400-e29b-41d4-a716-44665544000g"),"trailing g")
do false^STDASSERT(.pass,.fail,$$valid^STDUUID("550e8400-e29b-41d4-a716-44665544000Z"),"trailing Z")
quit
;
tValidRejectsEmpty(pass,fail) ;@TEST "valid() returns 0 for empty input"
do false^STDASSERT(.pass,.fail,$$valid^STDUUID(""),"empty rejected")
quit
;
tVersionDetectsAllRfcVersions(pass,fail) ;@TEST "version() returns the integer version 1-7"
new base,v
for v=1:1:7 do
. set base="550e8400-e29b-X1d4-a716-446655440000"
. set $extract(base,15)=v
. do eq^STDASSERT(.pass,.fail,$$version^STDUUID(base),v,"version "_v)
quit
;
tVersionReturnsEmptyForInvalid(pass,fail) ;@TEST "version() returns empty for malformed UUID"
do eq^STDASSERT(.pass,.fail,$$version^STDUUID("nope"),"","invalid -> empty")
do eq^STDASSERT(.pass,.fail,$$version^STDUUID(""),"","empty -> empty")
quit
;
tVariantClassifiesNcs(pass,fail) ;@TEST "variant() returns 'ncs' for high bit 0"
new base,v
for v="0","1","2","3","4","5","6","7" do
. set base="550e8400-e29b-41d4-X716-446655440000"
. set $extract(base,20)=v
. do eq^STDASSERT(.pass,.fail,$$variant^STDUUID(base),"ncs","variant nibble "_v)
quit
;
tVariantClassifiesRfc4122(pass,fail) ;@TEST "variant() returns 'rfc4122' for high bits 10"
new base,v
for v="8","9","a","b" do
. set base="550e8400-e29b-41d4-X716-446655440000"
. set $extract(base,20)=v
. do eq^STDASSERT(.pass,.fail,$$variant^STDUUID(base),"rfc4122","variant nibble "_v)
quit
;
tVariantClassifiesMicrosoft(pass,fail) ;@TEST "variant() returns 'microsoft' for high bits 110"
new base,v
for v="c","d" do
. set base="550e8400-e29b-41d4-X716-446655440000"
. set $extract(base,20)=v
. do eq^STDASSERT(.pass,.fail,$$variant^STDUUID(base),"microsoft","variant nibble "_v)
quit
;
tVariantClassifiesFuture(pass,fail) ;@TEST "variant() returns 'future' for high bits 111"
new base,v
for v="e","f" do
. set base="550e8400-e29b-41d4-X716-446655440000"
. set $extract(base,20)=v
. do eq^STDASSERT(.pass,.fail,$$variant^STDUUID(base),"future","variant nibble "_v)
quit
;
tVariantReturnsEmptyForInvalid(pass,fail) ;@TEST "variant() returns empty for malformed UUID"
do eq^STDASSERT(.pass,.fail,$$variant^STDUUID("nope"),"","invalid -> empty")
quit