Add TestDelIns ().
[m17n/m17n-lib-cs.git] / textprop.cs
1 using System;
2 using System.Collections.Generic;
3 using M17N.Core;
4
5 public class Test
6 {
7   const int LENGTH = 10;
8   const int DEPTH = 10;
9   static MText mt = new MText ("0123456789");
10   static MSymbol key = new MSymbol ("k");
11   static MSymbol val0 = new MSymbol ("0");
12   static MSymbol val1 = new MSymbol ("1");
13   static MSymbol val2 = new MSymbol ("2");
14   static MTextProperty prop0 = new MTextProperty (key, val0);
15   static MTextProperty prop1 = new MTextProperty (key, val1);
16   static MTextProperty prop2 = new MTextProperty (key, val2);
17
18   static int[] nvals = new int[LENGTH];
19   static MSymbol[,] valtable = new MSymbol[LENGTH, DEPTH + 1];
20
21   static void TestPushProp (int from, int to, MSymbol key, MSymbol val)
22   {
23     for (int i = from; i < to; i++)
24       if (nvals[i] == DEPTH)
25         return;
26
27     for (int i = from; i < to; i++)
28       {
29         valtable[i, nvals[i]] = val;
30         nvals[i]++;
31       }
32     Console.WriteLine ("from {0}, to {1}, push {2}, {3}.\n",
33                        from, to, key, val);
34
35     mt.PushProp (from, to, key, val);
36   }
37
38   static void TestPushProp (int from, int to, MTextProperty prop)
39   {
40     for (int i = from; i < to; i++)
41       if (nvals[i] == DEPTH)
42         return;
43
44     for (int i = from; i < to; i++)
45       {
46         valtable[i, nvals[i]] = (MSymbol) prop.Val;
47         nvals[i]++;
48       }
49     Console.WriteLine ("from {0}, to {1}, push {2}.\n", from, to, prop);
50
51     mt.PushProp (from, to, prop);
52   }
53
54   static void TestPopProp (int from, int to, MSymbol key)
55   {
56     for (int i = from; i < to; i++)
57       if (nvals[i] > 0)
58         {
59           valtable[i, nvals[i] - 1] = null;
60           nvals[i]--;
61         }
62     Console.WriteLine ("from {0}, to {1}, pop.\n", from, to);
63
64     mt.PopProp (from, to, key);
65   }
66     
67   static void TestDelIns (int from, int to, int from2)
68   {
69     int i, j, l = to - from;
70     int[] nvals2 = new int[LENGTH];
71     MSymbol[,] valtable2 = new MSymbol[LENGTH, DEPTH + 1];
72
73     // copy
74     for (i = from; i < to; i++)
75       {
76         nvals2[i - from] = nvals[i];
77         for (j = 0; j < nvals[i]; j++)
78           valtable2[i - from, j] = valtable[i, j];
79       }
80
81     // delete
82     for (i = to; i < LENGTH; i++)
83       {
84         nvals[i - l] = nvals[i];
85         for (j = 0; j < nvals[i]; j++)
86           valtable[i - l, j] = valtable[i, j];
87       }
88
89     // move
90     for (i = LENGTH - 1; i >= from2 + l; i--)
91       {
92         nvals[i] = nvals[i - l];
93         for (j = 0; j < nvals[i]; j++)
94           valtable[i, j] = valtable[i - l, j];
95       }
96
97     // insert
98     for (i = from2; i < from2 + l; i++)
99       {
100         nvals[i] = nvals2[i - from2];
101         for (j = 0; j < nvals[i]; j++)
102           valtable[i, j] = valtable2[i - from2, j];
103       }
104     Console.WriteLine ("from {0}, to {1}, moveto {2}.\n", from, to, from2);
105
106     MText mt2 = mt.Dup ();
107     mt.Del (from, to);
108     mt.Ins (from2, mt2, from, to);
109   }
110
111   static bool Compare ()
112   {
113     for (int i = 0; i < LENGTH; i++)
114       {
115         MTextProperty[] array;
116         object val = mt.GetProp (i, key, out array);
117
118         if (array == null)
119           {
120             if (nvals[i] != 0)
121               {
122                 Console.WriteLine ("nvals[{0}] is {1}, array.Length is null.\n",
123                                    i, nvals[i]);
124                 return false;
125               }
126           }
127
128         else if (nvals[i] != array.Length)
129           {
130             Console.WriteLine ("nvals[{0}] is {1}, array.Length is {2}.\n",
131                                i, nvals[i], array.Length);
132             return false;
133           }
134
135         else
136           {
137             for (int j = 0; j < nvals[i]; j++)
138               if (valtable[i, nvals[i] - 1 - j] != (MSymbol) array[j].Val)
139                 {
140                   Console.WriteLine ("valtable[{0}, {1}] is {2}, array[{1}] is {3}.\n",
141                                      i, j, valtable[i, j], array[j]);
142                   return false;
143                 }
144           }
145
146         if (val == null)
147           {
148             if (nvals[i] != 0)
149               {
150                 Console.WriteLine ("GetProp returned null for index {0}.\n",
151                                    i);
152                 return false;
153               }
154           }
155
156         else
157           {
158             if (nvals[i] == 0)
159               {
160                 Console.WriteLine ("GetProp returned {0} for index {1}.\n",
161                                    val, i);
162                 return false;
163               }
164
165             else if (valtable[i, nvals[i] - 1] == null)
166               {
167                 Console.WriteLine ("GetProp returned {0} for index {1}.\n",
168                                    val, i);
169                 return false;
170               }
171
172             else if ((MSymbol) val != valtable[i, nvals[i] - 1])
173               {
174                 Console.WriteLine ("GetProp returned {0} for index {1}.\n",
175                                    val, i);
176                 return false;
177               }
178           }
179       }
180     return true;
181   }
182
183   static void Dump ()
184   {
185     for (int i = 0; i < LENGTH; i++)
186       {
187         Console.Write (i + " ");
188         for (int j = nvals[i] - 1; j >= 0; j--)
189           Console.Write (valtable[i,j] + " ");
190         Console.WriteLine (":");
191       }
192     Console.WriteLine ("");
193   }
194
195   public static void Main (string[] args)
196   {
197     Random r = new Random (int.Parse (args[0]));
198     int check = (args.Length > 1 ? int.Parse (args[1]) : -1);
199
200     for (int loop = 0; loop < 30; loop++)
201       {
202         Console.WriteLine ("--- loop = {0} ---\n", loop);
203         if (loop == check)
204           {
205             mt.DumpPropNested ();
206             Dump ();
207             M17N.M17N.debug = true;
208           }
209
210         int from = r.Next (LENGTH);
211         int to = r.Next (LENGTH + 1);
212         if (from > to)
213           {
214             int tmp = from;
215             from = to;
216             to = tmp;
217           }
218
219         MSymbol val;
220         //MSymbol val = r.Next (2) == 0 ? val0 : val1;
221         switch (r.Next (3))
222           {
223           case 0:
224             val = val0;
225             break;
226           case 1:
227             val = val1;
228             break;
229           default:
230             val = val2;
231             break;
232           }
233
234         MTextProperty prop;
235         //MTextProperty prop = r.Next (2) == 0 ? prop0 : prop1;
236         switch (r.Next (3))
237           {
238           case 0:
239             prop = prop0;
240             break;
241           case 1:
242             prop = prop1;
243             break;
244           default:
245             prop = prop2;
246             break;
247           }
248
249         switch (r.Next (4))
250           {
251           case 0:
252             TestPushProp (from, to, key, val);
253             break;
254           case 1:
255             TestPushProp (from, to, prop);
256             break;
257           case 2:
258             TestPopProp (from, to, key);
259             break;
260           case 3:
261             TestDelIns (from, to, r.Next (LENGTH - (to - from) + 1));
262             break;
263           }
264
265         if (Compare () == false)
266           {
267             mt.DumpPropNested ();
268             Console.WriteLine ("");
269             Dump ();
270             Console.WriteLine ("Failed.");
271             return;
272           }
273       }
274
275   }
276 }