Commitc6b140bbRecorded15 Feb 2026Repositorysigil-version
test(version): Add test coverage for sigil-version package (Phase 3.3)
Message
Tests parsing, version->string roundtrip, comparison operators, prerelease ordering, constraints (caret, tilde, wildcard), bump utilities, and string->version alias.
Changed
test/test-version.sgl | 280 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 280 insertions(+)Diff
test/test-version.sgladded
@@ -0,0 +1,280 @@
+1
(import (sigil test)+2
(sigil version))+3
+4
;; ============================================================+5
;; Parsing+6
;; ============================================================+7
+8
(test-group "parse-version"+9
(test "basic version"+10
(let ((v (parse-version "1.2.3")))+11
(assert-true (version? v))+12
(assert-equal 1 (version-major v))+13
(assert-equal 2 (version-minor v))+14
(assert-equal 3 (version-patch v))+15
(assert-false (version-prerelease v))+16
(assert-false (version-build v))))+17
+18
(test "version with v prefix"+19
(let ((v (parse-version "v2.0.0")))+20
(assert-true (version? v))+21
(assert-equal 2 (version-major v))))+22
+23
(test "version with V prefix"+24
(let ((v (parse-version "V1.0.0")))+25
(assert-true (version? v))+26
(assert-equal 1 (version-major v))))+27
+28
(test "single major only"+29
(let ((v (parse-version "1")))+30
(assert-true (version? v))+31
(assert-equal 1 (version-major v))+32
(assert-equal 0 (version-minor v))+33
(assert-equal 0 (version-patch v))))+34
+35
(test "major.minor only"+36
(let ((v (parse-version "1.0")))+37
(assert-true (version? v))+38
(assert-equal 1 (version-major v))+39
(assert-equal 0 (version-minor v))+40
(assert-equal 0 (version-patch v))))+41
+42
(test "leading whitespace"+43
(let ((v (parse-version " 1.2.3")))+44
(assert-true (version? v))+45
(assert-equal 1 (version-major v))))+46
+47
(test "prerelease"+48
(let ((v (parse-version "1.0.0-alpha.1")))+49
(assert-true (version? v))+50
(assert-equal '("alpha" 1) (version-prerelease v))))+51
+52
(test "build metadata"+53
(let ((v (parse-version "1.0.0+build.42")))+54
(assert-true (version? v))+55
(assert-equal "build.42" (version-build v))))+56
+57
(test "prerelease and build"+58
(let ((v (parse-version "1.0.0-beta+exp.sha")))+59
(assert-true (version? v))+60
(assert-equal '("beta") (version-prerelease v))+61
(assert-equal "exp.sha" (version-build v))))+62
+63
(test "invalid: empty string"+64
(assert-false (parse-version "")))+65
+66
(test "invalid: letters"+67
(assert-false (parse-version "abc")))+68
+69
(test "invalid: non-string"+70
(assert-false (parse-version #f))))+71
+72
;; ============================================================+73
;; version->string roundtrip+74
;; ============================================================+75
+76
(test-group "version->string"+77
(test "basic roundtrip"+78
(assert-equal "1.2.3" (version->string (parse-version "1.2.3"))))+79
+80
(test "prerelease roundtrip"+81
(assert-equal "1.0.0-alpha.1" (version->string (parse-version "1.0.0-alpha.1"))))+82
+83
(test "build roundtrip"+84
(assert-equal "1.0.0+build.42" (version->string (parse-version "1.0.0+build.42"))))+85
+86
(test "combined roundtrip"+87
(assert-equal "1.0.0-beta+exp.sha"+88
(version->string (parse-version "1.0.0-beta+exp.sha")))))+89
+90
;; ============================================================+91
;; Comparison+92
;; ============================================================+93
+94
(test-group "version comparison"+95
(test "equal versions"+96
(assert-true (version=? (parse-version "1.0.0") (parse-version "1.0.0"))))+97
+98
(test "less than by major"+99
(assert-true (version<? (parse-version "1.0.0") (parse-version "2.0.0"))))+100
+101
(test "less than by minor"+102
(assert-true (version<? (parse-version "1.0.0") (parse-version "1.1.0"))))+103
+104
(test "less than by patch"+105
(assert-true (version<? (parse-version "1.0.0") (parse-version "1.0.1"))))+106
+107
(test "greater than"+108
(assert-true (version>? (parse-version "2.0.0") (parse-version "1.0.0"))))+109
+110
(test "less than or equal"+111
(assert-true (version<=? (parse-version "1.0.0") (parse-version "1.0.0")))+112
(assert-true (version<=? (parse-version "1.0.0") (parse-version "1.0.1"))))+113
+114
(test "greater than or equal"+115
(assert-true (version>=? (parse-version "1.0.0") (parse-version "1.0.0")))+116
(assert-true (version>=? (parse-version "1.0.1") (parse-version "1.0.0"))))+117
+118
(test "build metadata ignored in comparison"+119
(assert-true (version=? (parse-version "1.0.0+build1")+120
(parse-version "1.0.0+build2")))))+121
+122
;; ============================================================+123
;; Prerelease ordering+124
;; ============================================================+125
+126
(test-group "prerelease ordering"+127
(test "alpha < alpha.1"+128
(assert-true (version<? (parse-version "1.0.0-alpha")+129
(parse-version "1.0.0-alpha.1"))))+130
+131
(test "alpha.1 < beta"+132
(assert-true (version<? (parse-version "1.0.0-alpha.1")+133
(parse-version "1.0.0-beta"))))+134
+135
(test "prerelease < release"+136
(assert-true (version<? (parse-version "1.0.0-beta")+137
(parse-version "1.0.0"))))+138
+139
(test "numeric ids sort before string ids"+140
(assert-true (version<? (parse-version "1.0.0-1")+141
(parse-version "1.0.0-alpha")))))+142
+143
;; ============================================================+144
;; Constraints+145
;; ============================================================+146
+147
(test-group "parse-constraint"+148
(test "wildcard"+149
(assert-equal '(any) (parse-constraint "*")))+150
+151
(test "exact (no operator)"+152
(let ((c (parse-constraint "1.2.3")))+153
(assert-equal '= (car c))))+154
+155
(test "exact with ="+156
(let ((c (parse-constraint "= 1.2.3")))+157
(assert-equal '= (car c))))+158
+159
(test "greater than"+160
(let ((c (parse-constraint "> 1.0.0")))+161
(assert-equal '> (car c))))+162
+163
(test "greater than or equal"+164
(let ((c (parse-constraint ">= 1.0.0")))+165
(assert-equal '>= (car c))))+166
+167
(test "less than"+168
(let ((c (parse-constraint "< 2.0.0")))+169
(assert-equal '< (car c))))+170
+171
(test "less than or equal"+172
(let ((c (parse-constraint "<= 2.0.0")))+173
(assert-equal '<= (car c))))+174
+175
(test "caret"+176
(let ((c (parse-constraint "^1.2.3")))+177
(assert-equal 'caret (car c))))+178
+179
(test "tilde"+180
(let ((c (parse-constraint "~1.2.3")))+181
(assert-equal 'tilde (car c))))+182
+183
(test "invalid constraint"+184
(assert-false (parse-constraint "not-a-version"))))+185
+186
(test-group "version-satisfies?"+187
(test "wildcard matches anything"+188
(assert-true (version-satisfies? (parse-version "5.0.0") "*")))+189
+190
(test "exact match"+191
(assert-true (version-satisfies? (parse-version "1.2.3") "= 1.2.3"))+192
(assert-false (version-satisfies? (parse-version "1.2.4") "= 1.2.3")))+193
+194
(test "greater than"+195
(assert-true (version-satisfies? (parse-version "2.0.0") "> 1.0.0"))+196
(assert-false (version-satisfies? (parse-version "1.0.0") "> 1.0.0")))+197
+198
(test "greater than or equal"+199
(assert-true (version-satisfies? (parse-version "1.0.0") ">= 1.0.0"))+200
(assert-true (version-satisfies? (parse-version "2.0.0") ">= 1.0.0")))+201
+202
(test "less than"+203
(assert-true (version-satisfies? (parse-version "0.9.0") "< 1.0.0"))+204
(assert-false (version-satisfies? (parse-version "1.0.0") "< 1.0.0")))+205
+206
(test "less than or equal"+207
(assert-true (version-satisfies? (parse-version "1.0.0") "<= 1.0.0"))+208
(assert-true (version-satisfies? (parse-version "0.5.0") "<= 1.0.0"))))+209
+210
(test-group "caret constraints"+211
(test "^1.2.3 allows same major"+212
(assert-true (version-satisfies? (parse-version "1.5.0") "^1.2.3"))+213
(assert-false (version-satisfies? (parse-version "2.0.0") "^1.2.3")))+214
+215
(test "^1.2.3 requires >= base"+216
(assert-false (version-satisfies? (parse-version "1.2.2") "^1.2.3")))+217
+218
(test "^0.2.0 pins minor for 0.x"+219
(assert-true (version-satisfies? (parse-version "0.2.5") "^0.2.0"))+220
(assert-false (version-satisfies? (parse-version "0.3.0") "^0.2.0")))+221
+222
(test "^0.0.3 pins patch for 0.0.x"+223
(assert-true (version-satisfies? (parse-version "0.0.3") "^0.0.3"))+224
(assert-false (version-satisfies? (parse-version "0.0.4") "^0.0.3"))))+225
+226
(test-group "tilde constraints"+227
(test "~1.2.3 allows same major.minor"+228
(assert-true (version-satisfies? (parse-version "1.2.5") "~1.2.3"))+229
(assert-false (version-satisfies? (parse-version "1.3.0") "~1.2.3")))+230
+231
(test "~1.2.3 requires >= base"+232
(assert-false (version-satisfies? (parse-version "1.2.2") "~1.2.3"))))+233
+234
;; ============================================================+235
;; Bump utilities+236
;; ============================================================+237
+238
(test-group "version bumping"+239
(test "bump major resets minor and patch"+240
(let ((v (version-bump-major (parse-version "1.2.3"))))+241
(assert-equal "2.0.0" (version->string v))))+242
+243
(test "bump minor resets patch"+244
(let ((v (version-bump-minor (parse-version "1.2.3"))))+245
(assert-equal "1.3.0" (version->string v))))+246
+247
(test "bump patch"+248
(let ((v (version-bump-patch (parse-version "1.2.3"))))+249
(assert-equal "1.2.4" (version->string v)))))+250
+251
;; ============================================================+252
;; version-compatible?+253
;; ============================================================+254
+255
(test-group "version-compatible?"+256
(test "same major, higher version is compatible"+257
(assert-true (version-compatible? (parse-version "1.5.0")+258
(parse-version "1.2.0"))))+259
+260
(test "different major is not compatible"+261
(assert-false (version-compatible? (parse-version "2.0.0")+262
(parse-version "1.2.0"))))+263
+264
(test "lower version is not compatible"+265
(assert-false (version-compatible? (parse-version "1.1.0")+266
(parse-version "1.2.0")))))+267
+268
;; ============================================================+269
;; string->version alias+270
;; ============================================================+271
+272
(test-group "string->version"+273
(test "string->version is same as parse-version"+274
(let ((v (string->version "1.2.3")))+275
(assert-true (version? v))+276
(assert-equal 1 (version-major v))+277
(assert-equal 2 (version-minor v))+278
(assert-equal 3 (version-patch v)))))+279
+280
(run-tests)