*** empty log message ***
[m17n/m17n-lib-cs.git] / frontsensitive.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 ("fse",
12                                             MProperty.Flags.FrontSensitive);
13   static MSymbol val0 = MSymbol.Of ("0");
14   static MSymbol val1 = MSymbol.Of ("1");
15   static MSymbol val2 = MSymbol.Of ("2");
16   static MProperty prop0 = new MProperty (key, val0);
17   static MProperty prop1 = new MProperty (key, val1);
18   static MProperty prop2 = new MProperty (key, val2);
19
20   static MSymbol[] valtable = new MSymbol[LENGTH];
21
22   static void TestPushProp (int from, int to, MProperty prop)
23   {
24     int i;
25     MSymbol sym;
26
27     if (from > 0 && valtable[from] != null)
28       {
29         sym = valtable[from];
30         for (i = from - 1; i >= 0 && valtable[i] == sym; i--)
31           valtable[i] = null;
32       }
33     if (to < LENGTH && valtable[to - 1] != null)
34       {
35         sym = valtable[to - 1];
36         for (i = to; i < LENGTH && valtable[i] == sym; i++)
37           valtable[i] = null;
38       }
39     for (i = from; i < to; i++)
40       valtable[i] = (MSymbol) prop.Val;
41     Console.WriteLine ("from {0}, to {1}, push {2}.\n", from, to, prop.Val);
42
43     mt.PushProp (from, to, prop);
44   }
45
46   static void TestPopProp (int from, int to, MSymbol key)
47   {
48     int i;
49     MSymbol sym;
50
51     if (from > 0 && valtable[from] != null)
52       {
53         sym = valtable[from];
54         for (i = from - 1; i >= 0 && valtable[i] == sym; i--)
55           valtable[i] = null;
56       }
57     if (to < LENGTH && valtable[to - 1] != null)
58       {
59         sym = valtable[to - 1];
60         for (i = to; i < LENGTH && valtable[i] == sym; i++)
61           valtable[i] = null;
62       }
63     for (i = from; i < to; i++)
64       valtable[i] = null;
65     Console.WriteLine ("from {0}, to {1}, pop.\n", from, to);
66
67     mt.PopProp (from, to, key);
68   }
69     
70   static void TestDelIns (int from, int to, int from2)
71   {
72     int i, l = to - from;
73     MSymbol[] valtable2 = new MSymbol[LENGTH];
74     MSymbol sym;
75
76     // sensitivity for deletion
77     if (from > 0 && valtable[from] != null)
78       {
79         sym = valtable[from];
80         for (i = from - 1; i >= 0 && valtable[i] == sym; i--)
81           valtable[i] = null;
82         for (i = from; i < LENGTH && valtable[i] == sym; i++)
83           valtable[i] = null;
84       }
85     if (to < LENGTH && valtable[to] != null)
86       {
87         sym = valtable[to];
88         for (i = to - 1; i >= 0 && valtable[i] == sym; i--)
89           valtable[i] = null;
90         for (i = to; i < LENGTH && valtable[i] == sym; i++)
91           valtable[i] = null;
92       }
93
94     // copy
95     for (i = from; i < to; i++)
96       valtable2[i - from] = valtable[i];
97
98     // delete
99     for (i = to; i < LENGTH; i++)
100       valtable[i - l] = valtable[i];
101     for (i = LENGTH - l; i < LENGTH; i++)
102       valtable[i] = null;
103
104     // sensitivity for insertion
105     if (from2 > 0 && valtable[from2] != null)
106       {
107         sym = valtable[from2];
108         for (i = from2 - 1; i >= 0 && valtable[i] == sym; i--)
109           valtable[i] = null;
110         for (i = from2; i < LENGTH && valtable[i] == sym; i++)
111           valtable[i] = null;
112       }
113
114     // move
115     for (i = LENGTH - 1; i >= from2 + l; i--)
116       valtable[i] = valtable[i - l];
117
118     // insert
119     for (i = from2; i < from2 + l; i++)
120       valtable[i] = valtable2[i - from2];
121     Console.WriteLine ("from {0}, to {1}, moveto {2}.\n", from, to, from2);
122
123     MText mt2 = mt.Dup ();
124     mt.Del (from, to);
125     mt.Ins (from2, mt2, from, to);
126   }
127
128   static bool Compare ()
129   {
130     for (int i = 0; i < LENGTH; i++)
131       {
132         object val = mt.GetProp (i, key);
133
134         if (valtable[i] != (MSymbol) val)
135           {
136             Console.WriteLine ("valtable[{0}] is {1}, GetProp returned {2}",
137                                i,
138                                valtable[i] == null ? MSymbol.nil : valtable[i],
139                                val == null ? MSymbol.nil : val);
140             return false;
141           }
142       }
143     return true;
144   }
145
146   static void Dump ()
147   {
148     for (int i = 0; i < LENGTH; i++)
149       Console.WriteLine ("{0} {1} :", i, valtable[i]);
150   }
151
152   public static void Main (string[] args)
153   {
154     Random r = new Random (int.Parse (args[0]));
155     int check = (args.Length > 1 ? int.Parse (args[1]) : 0xFFFFFFF);
156
157     for (int loop = 0; loop < 1000000; loop++)
158       {
159         int from, to;
160
161         Console.WriteLine ("--- loop = {0} ---\n", loop);
162         if (loop >= check)
163           {
164             mt.DumpPropNested ();
165             Dump ();
166             M17n.debug = true;
167           }
168
169         do {
170           from = r.Next (LENGTH);
171           to = r.Next (LENGTH) + 1;
172         } while (from == to);
173         if (from > to)
174           {
175             int tmp = from;
176             from = to;
177             to = tmp;
178           }
179
180         MProperty prop;
181         switch (r.Next (3))
182           {
183           case 0:
184             prop = prop0;
185             break;
186           case 1:
187             prop = prop1;
188             break;
189           default:
190             prop = prop2;
191             break;
192           }
193
194         switch (r.Next (3))
195           {
196           case 0:
197             TestPushProp (from, to, prop);
198             break;
199           case 1:
200             TestPopProp (from, to, key);
201             break;
202           case 2:
203             TestDelIns (from, to, r.Next (LENGTH - (to - from) + 1));
204             break;
205           }
206
207         if (M17n.debug)
208           mt.DumpPropNested ();
209
210         if (Compare () == false)
211           {
212             Console.WriteLine ("");
213             Dump ();
214             Console.WriteLine ("Failed.");
215             return;
216           }
217       }
218   }
219 }