# encoding: UTF-8 # Copyright 2012 Twitter, Inc # http://www.apache.org/licenses/LICENSE-2.0 require 'spec_helper' describe TwitterCldr::Shared::CodePoint do def clear described_class.instance_variable_set(:@canonical_compositions, nil) described_class.instance_variable_set(:@block_cache, nil) described_class.instance_variable_set(:@blocks, nil) end after(:each) { clear } before(:each) { clear } describe "#initialize" do let(:unicode_data) { ['17D1', 'KHMER SIGN VIRIAM', 'Mn', '0', 'NSM', decomposition, "", "", "", 'N', "", "", "", "", ""] } let(:code_point) { described_class.new(unicode_data) } context 'when decomposition is canonical' do let(:decomposition) { '0028 007A 0029' } it 'parses decomposition mapping' do expect(code_point.decomposition).to eq([0x28, 0x7A, 0x29]) end it 'initializes compatibility tag as nil' do expect(code_point.compatibility_decomposition_tag).to be_nil end end context 'when decomposition is compatibility' do let(:decomposition) { ' 0028 007A 0029' } it 'parses decomposition mapping' do expect(code_point.decomposition).to eq([0x28, 0x7A, 0x29]) end it 'initializes compatibility decomposition tag' do expect(code_point.compatibility_decomposition_tag).to eq('font') end end context 'when decomposition is empty' do let(:decomposition) { '' } it 'parses decomposition mapping' do expect(code_point.decomposition).to be_nil end it 'initializes compatibility tag as nil' do expect(code_point.compatibility_decomposition_tag).to be_nil end end end describe '#properties' do it 'identifies all properties belonging to the code point' do code_point = described_class.get(65) properties = code_point.properties expect(properties.alphabetic).to eq(true) expect(properties.script).to eq(Set.new(%w(Latin))) expect(properties.general_category).to eq(Set.new(%w(L Lu))) end end describe '.properties' do it 'provides an instance of PropertiesDatabase' do expect(described_class.properties).to be_a(TwitterCldr::Shared::PropertiesDatabase) expect(described_class.properties.property_names.size).to be > 60 end end describe '.code_points_for_property' do it 'delegates to the properties database' do database = Object.new property_name = 'foo' property_value = 'bar' allow(described_class).to receive(:properties).and_return(database) expect(database).to receive(:code_points_for_property).with(property_name, property_value) described_class.code_points_for_property(property_name, property_value) end end describe '.properties_for_code_point' do it 'delegates to the properties database' do database = Object.new code_point = 65 allow(described_class).to receive(:properties).and_return(database) expect(database).to receive(:properties_for_code_point).with(code_point) described_class.properties_for_code_point(code_point) end end describe ".get" do it "retrieves information for any valid code point" do data = described_class.get(0x301) expect(data).to be_a(described_class) expect(data.fields.length).to eq(15) end it "returns nil if the information is not found" do expect(described_class.get(0xFFFFFFF)).to be_nil end it "fetches valid information for the specified code point" do test_code_points_data( 0x17D1 => [0x17D1, "KHMER SIGN VIRIAM", "Mn", "0", "NSM", "", "", "", "", "N", "", "", "", "", ""], 0xFE91 => [0xFE91, "ARABIC LETTER BEH INITIAL FORM", "Lo", "0", "AL", " 0628", "", "", "", "N", "GLYPH FOR INITIAL ARABIC BAA", "", "", "", ""], 0x24B5 => [0x24B5, "PARENTHESIZED LATIN SMALL LETTER Z", "So", "0", "L", " 0028 007A 0029", "", "", "", "N", "", "", "", "", ""], 0x2128 => [0x2128, "BLACK-LETTER CAPITAL Z", "Lu", "0", "L", " 005A", "", "", "", "N", "BLACK-LETTER Z", "", "", "", ""], 0x1F241 => [0x1F241, "TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09", "So", "0", "L", " 3014 4E09 3015", "", "", "", "N", "", "", "", "", ""] ) end it "fetches valid information for a code point within a range" do test_code_points_data( 0x4E11 => [0x4E11, "", "Lo", "0", "L", "", "", "", "", "N", "", "", "", "", ""], 0xAC55 => [0xAC55, "", "Lo", "0", "L", "", "", "", "", "N", "", "", "", "", ""], 0xD7A1 => [0xD7A1, "", "Lo", "0", "L", "", "", "", "", "N", "", "", "", "", ""], 0xDAAA => [0xDAAA, "", "Cs", "0", "L", "", "", "", "", "N", "", "", "", "", ""], 0xF8FE => [0xF8FE, "", "Co", "0", "L", "", "", "", "", "N", "", "", "", "", ""] ) end def test_code_points_data(test_data) test_data.each do |code_point, data| cp_data = described_class.get(code_point) expect(cp_data).not_to be_nil expect([:code_point, :name, :category, :combining_class].map { |msg| cp_data.send(msg) }).to eq(data[0..3]) end end end end