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