i
[chise/ruby.git] / test / org-test-ids.rb
1 #!/usr/bin/env ruby
2 # Copyright (C) 2002-2004 Kouichirou Eto, All rights reserved.
3 # by eto 2003-0112
4
5 require "common"
6
7 class TestIDS < Test::Unit::TestCase
8   def test_ids
9     char = "榊".char
10     assert_equal("⿰木神", char.ids)
11     assert_equal("⿰木神", char.decompose)
12     str = "榊"
13     assert_equal("⿰木神", str.char.ids)
14     assert_equal("⿰木神", str.decompose)
15     assert_equal("⿰木⿰⺭申", str.decompose.decompose)
16     assert_equal("⿰木神", str.decompose!)
17     assert_equal("⿰木⿰⺭申", str.decompose!)
18     str = "榊"
19     assert_equal("⿰木⿰⺭申", str.decompose_all)
20     assert_equal("⿰木⿰⺭申", str.decompose_all!)
21     assert_equal("⿰木⿰⺭申", str)
22     #今はまだcomposeはできない。
23
24     de = "細".decompose
25     assert_match(/田$/, de)  
26     assert_equal(3, de.char_length)
27     de = "&JX2-7577;".de_er.decompose
28     de = "&CDP-8B60;".de_er.decompose
29     assert_equal(1, de.char_length)
30     de = "&JX2-217E;".de_er.decompose
31     assert_match(/^⿰/, de)  
32     assert_equal(3, de.char_length)
33     assert_equal(6, de.decompose!.char_length)
34 #    assert_equal(6, de.decompose!.char_length)
35
36     assert("⿸".char.is_ids?)
37     assert(! "木".char.is_ids?)
38     assert_equal(2, "⿰".char.ids_operator_argc)
39     assert_equal(2, "&U+2FF0;".de_er.char.ids_operator_argc)
40     assert_equal(2, "&U+2FF1;".de_er.char.ids_operator_argc)
41     assert_equal(3, "&U+2FF2;".de_er.char.ids_operator_argc)
42     assert_equal(3, "&U+2FF3;".de_er.char.ids_operator_argc)
43
44     assert_equal("⿰", "&U+2FF0;".de_er.to_s)
45     assert("&U+2FF0;".de_er.char.is_ids?)
46     assert("&U+2FFF;".de_er.char.is_ids?)
47     #assert_match(/U\+2FF0/, "&U+2FF0;".de_er.char.inspect_x)
48     assert_match(/IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT/, "&U+2FF0;".de_er.char.inspect_all)
49     (0x2FF0..0x2FFB).each {|i|
50       assert_match(/IDEOGRAPHIC DESCRIPTION CHARACTER/, CHISE::Character.new(i).name)
51     }
52
53     assert_match(/LEFT TO RIGHT/, "&U+2FF0;".de_er.char.name)           #∫
54     assert_match(/ABOVE TO BELOW/, "&U+2FF1;".de_er.char.name)          #∨
55     assert_match(/LEFT TO MIDDLE AND RIGHT/, "&U+2FF2;".de_er.char.name)        #∬
56     assert_match(/ABOVE TO MIDDLE AND BELOW/, "&U+2FF3;".de_er.char.name)       #∀
57     assert_match(/FULL SURROUND/, "&U+2FF4;".de_er.char.name)           #∃
58     assert_match(/SURROUND FROM ABOVE/, "&U+2FF5;".de_er.char.name)             #∩
59     assert_match(/SURROUND FROM BELOW/, "&U+2FF6;".de_er.char.name)             #∪
60     assert_match(/SURROUND FROM LEFT/, "&U+2FF7;".de_er.char.name)              #⊂
61     assert_match(/SURROUND FROM UPPER LEFT/, "&U+2FF8;".de_er.char.name)        #√
62     assert_match(/SURROUND FROM UPPER RIGHT/, "&U+2FF9;".de_er.char.name)       #∂
63     assert_match(/SURROUND FROM LOWER LEFT/, "&U+2FFA;".de_er.char.name)        #∠
64     assert_match(/OVERLAID/, "&U+2FFB;".de_er.char.name) #∵
65   end
66
67   def test_tree
68     assert_equal("[]", CHISE::Tree.new().inspect)
69     assert_equal("[1]", CHISE::Tree.new().add_leaf(1).inspect)
70     assert_equal("[1, 2]", CHISE::Tree.new().add_leaf(1).add_leaf(2).inspect)
71     assert_equal("[[]]", CHISE::Tree.new().add_node.inspect)
72     assert_equal("[[1]]", CHISE::Tree.new().add_node.add_leaf(1).inspect)
73     assert_equal("[[1, 2]]", CHISE::Tree.new().add_node.add_leaf(1).add_leaf(2).inspect)
74     assert_equal("[[1]]", CHISE::Tree.new().add_node.add_leaf(1).end_node.inspect)
75     assert_equal("[[1], [1]]", CHISE::Tree.new().add_node.add_leaf(1).end_node.add_node.add_leaf(1).end_node.inspect)
76
77     tree = CHISE::Tree.new
78     assert_equal("[]", tree.inspect)
79     assert_equal("[1]", tree.add_leaf(1).inspect)
80     assert_equal(0, tree.depth)
81     assert_equal("[1, 2]", tree.add_leaf(2).inspect)
82     assert_equal("[1, 2, []]", tree.add_node.inspect)
83     assert_equal("[1, 2, [3]]", tree.add_leaf(3).inspect)
84     assert_equal(1, tree.depth)
85     assert_equal("[1, 2, [3, 4]]", tree.add_leaf(4).inspect)
86     assert_equal("[1, 2, [3, 4]]", tree.end_node.inspect)
87     assert_equal("[1, 2, [3, 4], [5]]", tree.add_node.add_leaf(5).inspect)
88     assert_equal("[1, 2, [3, 4], [5, [6]]]", tree.add_node.add_leaf(6).inspect)
89     assert_equal(2, tree.depth)
90
91     tree = CHISE::Tree.new
92     assert_equal("[[\"+\"]]", tree.add_node("+", 2).inspect)
93     assert_equal("[[\"+\", 1]]", tree.add_leaf(1).inspect)
94     assert_equal("unmatch leaves", tree.check_integrity)
95     assert_equal("[[\"+\", 1, 2]]", tree.add_leaf(2).inspect)
96     assert_nil(tree.check_integrity)
97     assert_equal("[[\"+\", 1, 2], 3]", tree.add_leaf(3).inspect)
98     assert_equal("extra nodes", tree.check_integrity)
99     
100     tree = CHISE::Tree.new
101     assert_equal("[[\"+\"]]", tree.add_node("+", 2).inspect)
102     assert_equal("unmatch leaves", tree.check_integrity)
103     assert_equal("[[\"+\", 1]]", tree.add_leaf(1).inspect)
104     assert_equal("unmatch leaves", tree.check_integrity)
105     assert_equal("[[\"+\", 1, [\"+\"]]]", tree.add_node("+", 2).inspect)
106     assert_equal("unmatch leaves", tree.check_integrity)
107     assert_equal("[[\"+\", 1, [\"+\", 2]]]", tree.add_leaf(2).inspect)
108     assert_equal("unmatch leaves", tree.check_integrity)
109     assert_equal("[[\"+\", 1, [\"+\", 2, 3]]]", tree.add_leaf(3).inspect)
110     assert_nil(tree.check_integrity)
111
112     tree = CHISE::Tree.new
113     assert_equal("[1]", tree.add_leaf(1).inspect)
114     assert_nil(tree.check_integrity)
115     assert_equal("[1, 2]", tree.add_leaf(2).inspect)
116     assert_equal("extra leaves", tree.check_integrity)
117   end
118
119   def test_ids_tree
120 #    assert_equal("[[<+,U+002B>, <A,U+0041>, <B,U+0042>]]", CHISE::IDS_Tree.new("+AB").inspect)
121 #    assert_equal("[[<+,U+002B>, <A,U+0041>, <B,U+0042>], <C,U+0043>]", CHISE::IDS_Tree.new("+ABC").inspect)
122 #    assert_equal("[[<+,U+002B>, <A,U+0041>, [<+,U+002B>, <B,U+0042>, <C,U+0043>]]]", CHISE::IDS_Tree.new("+A+BC").inspect)
123 #    assert_equal("[[<+,U+002B>, <A,U+0041>, [<+,U+002B>, <B,U+0042>, <C,U+0043>]], <D,U+0044>]", CHISE::IDS_Tree.new("+A+BCD").inspect)
124
125     #assert_equal("[<榊,U+698A>]", CHISE::IDS_Tree.new("榊").inspect)
126 #    assert_equal("[[<⿰,U+2FF0>, <木,J90-4C5A>, <神,J90-3F40>]]", CHISE::IDS_Tree.new("⿰木神").inspect)
127     assert_equal(1, CHISE::IDS_Tree.new("⿰木神").depth)
128 #    assert_equal("[[<⿰,U+2FF0>, <木,J90-4C5A>, [<⿰,U+2FF0>, <⺭,CDP-8B70>, <申,J90-3F3D>]]]", CHISE::IDS_Tree.new("⿰木⿰⺭申").inspect)
129     assert_equal(2, CHISE::IDS_Tree.new("⿰木⿰⺭申").depth)
130     assert_equal("unmatch leaves", CHISE::IDS_Tree.new("⿰木").check_integrity)
131     assert_nil(CHISE::IDS_Tree.new("⿰木神").check_integrity)
132     assert_equal("unmatch leaves", CHISE::IDS_Tree.new("⿰木⿰申").check_integrity)
133     assert_nil(CHISE::IDS_Tree.new("⿰木⿰⺭申").check_integrity)
134     assert_equal("extra nodes", CHISE::IDS_Tree.new("⿰木⿰⺭申申").check_integrity)
135     assert_nil(CHISE::IDS_Tree.new("榊").check_integrity)
136     assert_equal("extra leaves", CHISE::IDS_Tree.new("榊榊").check_integrity)
137
138     assert_equal(3, "⿳".char.ids_operator_argc)
139     assert_equal("⿳士冖匕", "壱".char.ids)
140     assert_equal(3, "壱".char.ids.char.ids_operator_argc)
141     assert_nil(CHISE::IDS_Tree.new("⿳士冖匕").check_integrity)
142     assert_equal("unmatch leaves", CHISE::IDS_Tree.new("⿳士冖").check_integrity)
143     assert_equal("extra nodes", CHISE::IDS_Tree.new("⿳士冖匕匕").check_integrity)
144
145     assert_equal("contains ques", CHISE::IDS_Tree.new("⿳士冖?").check_integrity)
146   end
147
148   def test_tree_depth
149     assert_equal(1, CHISE::IDS_Tree.new("林".decompose).depth)
150 #    assert_equal("["⿰木木"]", CHISE::IDS_Tree.new("林".decompose).nodes.inspect)
151 #    assert_equal("[]", CHISE::IDS_Tree.new("林".decompose).sub_nodes.inspect)
152     assert_equal(2, CHISE::IDS_Tree.new("榊".decompose_all).depth)
153 #    assert_equal("["⿰木⿰⺭申", "⿰⺭申"]", CHISE::IDS_Tree.new("榊".decompose_all).nodes.inspect)
154 #    assert_equal("["⿰⺭申"]", CHISE::IDS_Tree.new("榊".decompose_all).sub_nodes.inspect)
155
156 #    assert_equal(3, CHISE::IDS_Tree.new("焔".decompose_all).depth)
157 #    assert_equal(3, CHISE::IDS_Tree.new("焔".decompose_all).nodes.length)
158 #    assert_equal(2, CHISE::IDS_Tree.new("焔".decompose_all).sub_nodes.length)
159
160     assert_equal(2, CHISE::IDS_Tree.new("屡".decompose_all).depth)
161     assert_equal("⿸尸娄", "⿸尸⿱米女".aggregate)
162     assert_equal(3, CHISE::IDS_Tree.new("醤".decompose_all).depth)
163   end
164
165   def test_compose_exact #正確に一致するIDSを検知する
166     assert_equal("榊", "榊".decompose.compose)
167     assert_equal("壱", "壱".decompose.compose)
168     assert_equal("⿰木木", "林".decompose)
169     assert_equal("林", "⿰木木".compose)
170     assert_equal("林", "林".decompose.compose)
171     assert_equal("⿰木木", "⿰木木".compose.decompose)
172     assert_equal("林".ucs, "⿰木木".compose.ucs)
173   end
174
175   def test_idc_shortcut
176     assert_equal(IDC_LR, "林".decompose.first_char)
177     assert_equal(IDC_LR+"木木", "林".decompose)
178
179     assert_equal(IDC_AB, "森".decompose.first_char)
180     assert_equal(IDC_AB+"木林", "森".decompose)
181     assert_equal(IDC_AB+"火火", "炎".decompose)
182
183     assert_equal(IDC_LMR, "班".decompose.first_char)
184     assert_equal(IDC_LMR+"彳"+IDC_AB+"山王"+"攵", "徴".decompose) #meaning?
185
186     assert_equal(IDC_AMB, "鼻".decompose.first_char)
187     assert_equal(IDC_AMB+"自田廾", "鼻".decompose)
188     assert_equal(IDC_AMB+"士冖匕", "壱".decompose)
189     assert_equal(IDC_AMB+"穴厶心", "窓".decompose)
190     assert_equal(IDC_AMB+"丗冖巾", "帯".decompose)
191
192     assert_equal(IDC_FS, "囲".decompose.first_char)
193     assert_equal(IDC_FS+"囗井", "囲".decompose)
194     assert_equal(IDC_FS+"行韋", "衛".decompose)
195     assert_equal(IDC_FS+"行圭", "街".decompose)
196     assert_equal(IDC_FS+"行重", "衝".decompose)
197     assert_equal(IDC_FS+IDC_AB+"一凵田", "画".decompose)
198
199     assert_equal(IDC_FA, "問".decompose.first_char)
200     assert_equal(IDC_FA+"門口", "問".decompose)
201     assert_equal(IDC_FA+"門"+IDC_LR+"豆寸", "闘".decompose)
202     assert_equal(IDC_FA+"戌女", "威".decompose)
203     assert_equal(IDC_FA+"茂臣", "蔵".decompose)
204     assert_equal(IDC_FA+"尺旦", "昼".decompose)
205     assert_equal(IDC_FA+"冂入", "内".decompose)
206     assert_equal(IDC_FA+"几丶", "凡".decompose)
207     assert_equal(IDC_FA+"几"+IDC_AB+"丿虫", "風".decompose)
208
209     assert_equal(IDC_FB, "凶".decompose.first_char)
210     assert_equal(IDC_AB+"止"+IDC_FB+"凵米", "歯".decompose)
211
212     assert_equal(IDC_FL, "匠".decompose.first_char)
213     assert_equal(IDC_FL+"匚斤", "匠".decompose)
214     assert_equal(IDC_FL+"匚矢", "医".decompose)
215     assert_equal(IDC_FL+"匚若", "匿".decompose)
216     assert_equal(IDC_FL+"匚儿", "匹".decompose)
217
218     assert_equal(IDC_FUL, "庁".decompose.first_char)
219     assert_equal(IDC_FUL+"广丁", "庁".decompose)
220     assert_equal(IDC_FUL+"歹匕", "死".decompose)
221     assert_equal(IDC_FUL+"尹口", "君".decompose)
222     assert_equal(IDC_FUL+"麻鬼", "魔".decompose)
223     assert_equal(IDC_FUL+"府肉", "腐".decompose)
224     assert_equal(IDC_FUL+"麻手", "摩".decompose)
225     assert_equal(IDC_FUL+"虍思", "慮".decompose)
226     assert_equal(IDC_FUL+"食口", "倉".decompose)
227     assert_equal(IDC_AB+"日"+IDC_FUL+"耳又", "最".decompose)
228     assert_equal(IDC_FUL+"手目", "看".decompose) #meaning
229     assert_equal(IDC_FUL+"辰口", "唇".decompose) #?
230
231     assert_equal(IDC_FUR, "句".decompose.first_char)
232     assert_equal(IDC_FUR+"勹口", "句".decompose)
233     assert_equal(IDC_FUR+"勹丶", "勺".decompose)
234     assert_equal(IDC_FUR+"勹日", "旬".decompose)
235     assert_equal(IDC_FUR+"戈廾", "戒".decompose)
236     assert_equal(IDC_FUR+"弋工", "式".decompose)
237     assert_equal(IDC_FUR+"刀丿", "刃".decompose)
238     assert_equal(IDC_FUR+"鳥山", "島".decompose) #meaning
239
240     assert_equal(IDC_FLL, "通".decompose.first_char)
241     assert_equal(IDC_FLL+"廴聿", "建".decompose)
242     assert_equal(IDC_FLL+"走戉", "越".decompose)
243     assert_equal(IDC_FLL+"走巳", "起".decompose)
244     assert_equal(IDC_FLL+"走取", "趣".decompose)
245     assert_equal(IDC_FLL+"走召", "超".decompose)
246     assert_equal(IDC_FLL+"是頁", "題".decompose)
247     assert_equal(IDC_FLL+"免力", "勉".decompose)
248     assert_equal(IDC_FLL+"鬼未", "魅".decompose)
249     assert_equal(IDC_FLL+"黒犬", "黙".decompose)
250
251     assert_equal(IDC_O, "太".decompose.first_char)
252     assert_equal(IDC_O+"大丶", "太".decompose)
253     assert_equal(IDC_O+"衣中", "衷".decompose)
254     assert_equal(IDC_O+"衣里", "裏".decompose)
255     assert_equal(IDC_O+"勹巳", "包".decompose)
256     assert_equal(IDC_O+"勹乂", "匁".decompose)
257     assert_equal(IDC_O+"木日", "東".decompose)
258     assert_equal(IDC_O+"弍一", "弐".decompose)
259     assert_equal(IDC_O+"衣保", "褒".decompose)
260   end
261
262   def test_glyph_decompose
263     assert_equal("音", "音".decompose)
264 #    assert_equal(IDC_AB+"立日", "音".glyph_decompose)
265     assert_equal(IDC_FLL, "世".decompose.first_char)
266     assert_equal("世", "世".glyph_decompose)
267   end
268
269   def test_find()
270 #    p "日雲".find #"曇"
271     assert(4 <= "日雲".find .char_length) #"曇"
272   end
273
274   def test_compose_part()
275 #    p de.compose_ar
276 #    p "神".compose_ar
277 #    p "木".compose_ar.join
278   end
279
280   def test_aggregate()
281 #    db = IDS_DB.instance
282 #    db.list_aggregate
283   end
284
285   def test_ids_error()
286 #    p "実".char.inspect_all
287 #    p "実".char.ids
288 #    assert_equal("contains ques", "実".char.ids_error)
289 #    assert_equal("unmatch leaves", "実".char.ids_error)
290 #    p CharDB.instance.get("ascii").keys
291 #    p CharDB.instance.get("no-such-attribute").keys
292 #    p CharDB.instance.get("ids-error").keys
293   end
294
295 end