summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tool/lib/core_assertions.rb27
-rw-r--r--tool/test/testunit/test_assertion.rb105
2 files changed, 127 insertions, 5 deletions
diff --git a/tool/lib/core_assertions.rb b/tool/lib/core_assertions.rb
index 55ef93bed0..62ada2bdca 100644
--- a/tool/lib/core_assertions.rb
+++ b/tool/lib/core_assertions.rb
@@ -882,15 +882,32 @@ eom
mswin? or mingw?
end
- def self.compare_version(a, b)
- b.empty? ? true && a : a && (a <=> b) >= 0
+ def self.version_compare(expected, actual)
+ expected.zip(actual).each {|e, a| z = (e <=> a); return z if z.nonzero?}
+ 0
+ end
+
+ def self.version_match?(expected, actual)
+ if !actual
+ false
+ elsif expected.empty?
+ true
+ elsif expected.size == 1 and Range === (range = expected.first)
+ b, e = range.begin, range.end
+ return false if b and (c = version_compare(Array(b), actual)) > 0
+ return false if e and (c = version_compare(Array(e), actual)) < 0
+ return false if e and range.exclude_end? and c == 0
+ true
+ else
+ version_compare(expected, actual).zero?
+ end
end
def self.linux?(*ver)
unless defined?(@linux)
@linux = RUBY_PLATFORM.include?('linux') && `uname -r`.scan(/\d+/).map(&:to_i)
end
- compare_version @linux, ver
+ version_match? ver, @linux
end
private def linux?(*ver)
CoreAssertions.linux?(*ver)
@@ -905,7 +922,7 @@ eom
@glibc = false
end
end
- compare_version @glibc, ver
+ version_match? ver, @glibc
end
private def glibc?(*ver)
CoreAssertions.glibc?(*ver)
@@ -915,7 +932,7 @@ eom
unless defined?(@macos)
@macos = RUBY_PLATFORM.include?('darwin') && `sw_vers -productVersion`.scan(/\d+/).map(&:to_i)
end
- compare_version @macos, ver
+ version_match? ver, @macos
end
private def macos?(*ver)
CoreAssertions.macos?(*ver)
diff --git a/tool/test/testunit/test_assertion.rb b/tool/test/testunit/test_assertion.rb
index 1e19c102b8..65c11fda42 100644
--- a/tool/test/testunit/test_assertion.rb
+++ b/tool/test/testunit/test_assertion.rb
@@ -63,4 +63,109 @@ class TestAssertion < Test::Unit::TestCase
def assert_fail_for_backtrace_location
assert false
end
+
+ VersionClass = Struct.new(:version) do
+ def version?(*ver)
+ Test::Unit::CoreAssertions.version_match?(ver, self.version)
+ end
+ end
+
+ V14_6_0 = VersionClass.new([14, 6, 0])
+ V15_0_0 = VersionClass.new([15, 0, 0])
+
+ def test_version_match_integer
+ assert_not_operator(V14_6_0, :version?, 13)
+ assert_operator(V14_6_0, :version?, 14)
+ assert_not_operator(V14_6_0, :version?, 15)
+ assert_not_operator(V15_0_0, :version?, 14)
+ assert_operator(V15_0_0, :version?, 15)
+ end
+
+ def test_version_match_integer_range
+ assert_operator(V14_6_0, :version?, 13..14)
+ assert_not_operator(V15_0_0, :version?, 13..14)
+ assert_not_operator(V14_6_0, :version?, 13...14)
+ assert_not_operator(V15_0_0, :version?, 13...14)
+ end
+
+ def test_version_match_array_range
+ assert_operator(V14_6_0, :version?, [14, 0]..[14, 6])
+ assert_not_operator(V15_0_0, :version?, [14, 0]..[14, 6])
+ assert_not_operator(V14_6_0, :version?, [14, 0]...[14, 6])
+ assert_not_operator(V15_0_0, :version?, [14, 0]...[14, 6])
+ assert_operator(V14_6_0, :version?, [14, 0]..[15])
+ assert_operator(V15_0_0, :version?, [14, 0]..[15])
+ assert_operator(V14_6_0, :version?, [14, 0]...[15])
+ assert_not_operator(V15_0_0, :version?, [14, 0]...[15])
+ end
+
+ def test_version_match_integer_endless_range
+ assert_operator(V14_6_0, :version?, 14..)
+ assert_operator(V15_0_0, :version?, 14..)
+ assert_not_operator(V14_6_0, :version?, 15..)
+ assert_operator(V15_0_0, :version?, 15..)
+ end
+
+ def test_version_match_integer_endless_range_exclusive
+ assert_operator(V14_6_0, :version?, 14...)
+ assert_operator(V15_0_0, :version?, 14...)
+ assert_not_operator(V14_6_0, :version?, 15...)
+ assert_operator(V15_0_0, :version?, 15...)
+ end
+
+ def test_version_match_array_endless_range
+ assert_operator(V14_6_0, :version?, [14, 5]..)
+ assert_operator(V15_0_0, :version?, [14, 5]..)
+ assert_not_operator(V14_6_0, :version?, [14, 7]..)
+ assert_operator(V15_0_0, :version?, [14, 7]..)
+ assert_not_operator(V14_6_0, :version?, [15]..)
+ assert_operator(V15_0_0, :version?, [15]..)
+ assert_not_operator(V14_6_0, :version?, [15, 0]..)
+ assert_operator(V15_0_0, :version?, [15, 0]..)
+ end
+
+ def test_version_match_array_endless_range_exclude_end
+ assert_operator(V14_6_0, :version?, [14, 5]...)
+ assert_operator(V15_0_0, :version?, [14, 5]...)
+ assert_not_operator(V14_6_0, :version?, [14, 7]...)
+ assert_operator(V15_0_0, :version?, [14, 7]...)
+ assert_not_operator(V14_6_0, :version?, [15]...)
+ assert_operator(V15_0_0, :version?, [15]...)
+ assert_not_operator(V14_6_0, :version?, [15, 0]...)
+ assert_operator(V15_0_0, :version?, [15, 0]...)
+ end
+
+ def test_version_match_integer_beginless_range
+ assert_operator(V14_6_0, :version?, ..14)
+ assert_not_operator(V15_0_0, :version?, ..14)
+ assert_operator(V14_6_0, :version?, ..15)
+ assert_operator(V15_0_0, :version?, ..15)
+
+ assert_not_operator(V14_6_0, :version?, ...14)
+ assert_not_operator(V15_0_0, :version?, ...14)
+ assert_operator(V14_6_0, :version?, ...15)
+ assert_not_operator(V15_0_0, :version?, ...15)
+ end
+
+ def test_version_match_array_beginless_range
+ assert_not_operator(V14_6_0, :version?, ..[14, 5])
+ assert_not_operator(V15_0_0, :version?, ..[14, 5])
+ assert_operator(V14_6_0, :version?, ..[14, 6])
+ assert_not_operator(V15_0_0, :version?, ..[14, 6])
+ assert_operator(V14_6_0, :version?, ..[15])
+ assert_operator(V15_0_0, :version?, ..[15])
+ assert_operator(V14_6_0, :version?, ..[15, 0])
+ assert_operator(V15_0_0, :version?, ..[15, 0])
+ end
+
+ def test_version_match_array_beginless_range_exclude_end
+ assert_not_operator(V14_6_0, :version?, ...[14, 5])
+ assert_not_operator(V15_0_0, :version?, ...[14, 5])
+ assert_not_operator(V14_6_0, :version?, ...[14, 6])
+ assert_not_operator(V15_0_0, :version?, ...[14, 6])
+ assert_operator(V14_6_0, :version?, ...[15])
+ assert_not_operator(V15_0_0, :version?, ...[15])
+ assert_operator(V14_6_0, :version?, ...[15, 0])
+ assert_not_operator(V15_0_0, :version?, ...[15, 0])
+ end
end