2017-07-09 08:06:36 -04:00
|
|
|
# frozen_string_literal: true
|
2008-09-21 11:37:38 -04:00
|
|
|
|
2016-08-06 12:03:25 -04:00
|
|
|
require "abstract_unit"
|
|
|
|
require "multibyte_test_helpers"
|
2008-09-21 11:37:38 -04:00
|
|
|
|
2016-01-24 09:22:14 -05:00
|
|
|
class MultibyteNormalizationConformanceTest < ActiveSupport::TestCase
|
2008-09-21 11:37:38 -04:00
|
|
|
include MultibyteTestHelpers
|
2010-08-14 01:13:00 -04:00
|
|
|
|
2016-08-06 12:03:25 -04:00
|
|
|
UNIDATA_FILE = "/NormalizationTest.txt"
|
2016-07-04 07:36:30 -04:00
|
|
|
RUN_P = begin
|
|
|
|
Downloader.download(UNIDATA_URL + UNIDATA_FILE, CACHE_DIR + UNIDATA_FILE)
|
|
|
|
rescue
|
|
|
|
end
|
2010-08-14 01:13:00 -04:00
|
|
|
|
2008-09-21 11:21:30 -04:00
|
|
|
def setup
|
|
|
|
@proxy = ActiveSupport::Multibyte::Chars
|
2016-07-04 07:36:30 -04:00
|
|
|
skip "Unable to download test data" unless RUN_P
|
2008-09-21 11:21:30 -04:00
|
|
|
end
|
2010-08-14 01:13:00 -04:00
|
|
|
|
2006-10-03 19:45:32 -04:00
|
|
|
def test_normalizations_C
|
2018-10-12 11:40:29 -04:00
|
|
|
ActiveSupport::Deprecation.silence do
|
|
|
|
each_line_of_norm_tests do |*cols|
|
|
|
|
col1, col2, col3, col4, col5, comment = *cols
|
2010-08-14 01:13:00 -04:00
|
|
|
|
2018-10-12 11:40:29 -04:00
|
|
|
# CONFORMANCE:
|
|
|
|
# 1. The following invariants must be true for all conformant implementations
|
|
|
|
#
|
|
|
|
# NFC
|
|
|
|
# c2 == NFC(c1) == NFC(c2) == NFC(c3)
|
|
|
|
assert_equal_codepoints col2, @proxy.new(col1).normalize(:c), "Form C - Col 2 has to be NFC(1) - #{comment}"
|
|
|
|
assert_equal_codepoints col2, @proxy.new(col2).normalize(:c), "Form C - Col 2 has to be NFC(2) - #{comment}"
|
|
|
|
assert_equal_codepoints col2, @proxy.new(col3).normalize(:c), "Form C - Col 2 has to be NFC(3) - #{comment}"
|
|
|
|
#
|
|
|
|
# c4 == NFC(c4) == NFC(c5)
|
|
|
|
assert_equal_codepoints col4, @proxy.new(col4).normalize(:c), "Form C - Col 4 has to be C(4) - #{comment}"
|
|
|
|
assert_equal_codepoints col4, @proxy.new(col5).normalize(:c), "Form C - Col 4 has to be C(5) - #{comment}"
|
|
|
|
end
|
2006-10-03 19:45:32 -04:00
|
|
|
end
|
|
|
|
end
|
2010-08-14 01:13:00 -04:00
|
|
|
|
2006-10-03 19:45:32 -04:00
|
|
|
def test_normalizations_D
|
2018-10-12 11:40:29 -04:00
|
|
|
ActiveSupport::Deprecation.silence do
|
|
|
|
each_line_of_norm_tests do |*cols|
|
|
|
|
col1, col2, col3, col4, col5, comment = *cols
|
|
|
|
#
|
|
|
|
# NFD
|
|
|
|
# c3 == NFD(c1) == NFD(c2) == NFD(c3)
|
|
|
|
assert_equal_codepoints col3, @proxy.new(col1).normalize(:d), "Form D - Col 3 has to be NFD(1) - #{comment}"
|
|
|
|
assert_equal_codepoints col3, @proxy.new(col2).normalize(:d), "Form D - Col 3 has to be NFD(2) - #{comment}"
|
|
|
|
assert_equal_codepoints col3, @proxy.new(col3).normalize(:d), "Form D - Col 3 has to be NFD(3) - #{comment}"
|
|
|
|
# c5 == NFD(c4) == NFD(c5)
|
|
|
|
assert_equal_codepoints col5, @proxy.new(col4).normalize(:d), "Form D - Col 5 has to be NFD(4) - #{comment}"
|
|
|
|
assert_equal_codepoints col5, @proxy.new(col5).normalize(:d), "Form D - Col 5 has to be NFD(5) - #{comment}"
|
|
|
|
end
|
2006-10-03 19:45:32 -04:00
|
|
|
end
|
|
|
|
end
|
2010-08-14 01:13:00 -04:00
|
|
|
|
2006-10-03 19:45:32 -04:00
|
|
|
def test_normalizations_KC
|
2018-10-12 11:40:29 -04:00
|
|
|
ActiveSupport::Deprecation.silence do
|
|
|
|
each_line_of_norm_tests do | *cols |
|
|
|
|
col1, col2, col3, col4, col5, comment = *cols
|
|
|
|
#
|
|
|
|
# NFKC
|
|
|
|
# c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) == NFKC(c5)
|
|
|
|
assert_equal_codepoints col4, @proxy.new(col1).normalize(:kc), "Form D - Col 4 has to be NFKC(1) - #{comment}"
|
|
|
|
assert_equal_codepoints col4, @proxy.new(col2).normalize(:kc), "Form D - Col 4 has to be NFKC(2) - #{comment}"
|
|
|
|
assert_equal_codepoints col4, @proxy.new(col3).normalize(:kc), "Form D - Col 4 has to be NFKC(3) - #{comment}"
|
|
|
|
assert_equal_codepoints col4, @proxy.new(col4).normalize(:kc), "Form D - Col 4 has to be NFKC(4) - #{comment}"
|
|
|
|
assert_equal_codepoints col4, @proxy.new(col5).normalize(:kc), "Form D - Col 4 has to be NFKC(5) - #{comment}"
|
|
|
|
end
|
2006-10-03 19:45:32 -04:00
|
|
|
end
|
|
|
|
end
|
2010-08-14 01:13:00 -04:00
|
|
|
|
2006-10-03 19:45:32 -04:00
|
|
|
def test_normalizations_KD
|
2018-10-12 11:40:29 -04:00
|
|
|
ActiveSupport::Deprecation.silence do
|
|
|
|
each_line_of_norm_tests do | *cols |
|
|
|
|
col1, col2, col3, col4, col5, comment = *cols
|
|
|
|
#
|
|
|
|
# NFKD
|
|
|
|
# c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5)
|
|
|
|
assert_equal_codepoints col5, @proxy.new(col1).normalize(:kd), "Form KD - Col 5 has to be NFKD(1) - #{comment}"
|
|
|
|
assert_equal_codepoints col5, @proxy.new(col2).normalize(:kd), "Form KD - Col 5 has to be NFKD(2) - #{comment}"
|
|
|
|
assert_equal_codepoints col5, @proxy.new(col3).normalize(:kd), "Form KD - Col 5 has to be NFKD(3) - #{comment}"
|
|
|
|
assert_equal_codepoints col5, @proxy.new(col4).normalize(:kd), "Form KD - Col 5 has to be NFKD(4) - #{comment}"
|
|
|
|
assert_equal_codepoints col5, @proxy.new(col5).normalize(:kd), "Form KD - Col 5 has to be NFKD(5) - #{comment}"
|
|
|
|
end
|
2006-10-03 19:45:32 -04:00
|
|
|
end
|
|
|
|
end
|
2010-08-14 01:13:00 -04:00
|
|
|
|
2016-12-23 06:31:57 -05:00
|
|
|
private
|
2006-10-03 19:45:32 -04:00
|
|
|
def each_line_of_norm_tests(&block)
|
|
|
|
lines = 0
|
|
|
|
max_test_lines = 0 # Don't limit below 38, because that's the header of the testfile
|
2016-08-06 12:03:25 -04:00
|
|
|
File.open(File.join(CACHE_DIR, UNIDATA_FILE), "r") do | f |
|
2016-09-01 17:41:49 -04:00
|
|
|
until f.eof? || (max_test_lines > 38 && lines > max_test_lines)
|
2006-10-03 19:45:32 -04:00
|
|
|
lines += 1
|
|
|
|
line = f.gets.chomp!
|
2016-08-06 12:03:25 -04:00
|
|
|
next if line.empty? || line.start_with?("#")
|
2010-08-14 01:13:00 -04:00
|
|
|
|
2006-10-03 19:45:32 -04:00
|
|
|
cols, comment = line.split("#")
|
2016-08-16 03:30:11 -04:00
|
|
|
cols = cols.split(";").map { |e| e.strip }.reject { |e| e.empty? }
|
2006-10-03 19:45:32 -04:00
|
|
|
next unless cols.length == 5
|
2010-08-14 01:13:00 -04:00
|
|
|
|
2006-10-03 19:45:32 -04:00
|
|
|
# codepoints are in hex in the test suite, pack wants them as integers
|
2016-08-16 03:30:11 -04:00
|
|
|
cols.map! { |c| c.split.map { |codepoint| codepoint.to_i(16) }.pack("U*") }
|
2006-10-03 19:45:32 -04:00
|
|
|
cols << comment
|
2010-08-14 01:13:00 -04:00
|
|
|
|
2006-10-03 19:45:32 -04:00
|
|
|
yield(*cols)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2010-08-14 01:13:00 -04:00
|
|
|
|
2008-09-21 11:21:30 -04:00
|
|
|
def inspect_codepoints(str)
|
2016-08-16 03:30:11 -04:00
|
|
|
str.to_s.unpack("U*").map { |cp| cp.to_s(16) }.join(" ")
|
2006-10-03 19:45:32 -04:00
|
|
|
end
|
2013-11-13 17:18:56 -05:00
|
|
|
end
|