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