New file.
[m17n/m17n-lib-cs.git] / rearsensitive.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 ("rse",
12                                             MProperty.Flags.Sensitive);
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 - 1] != null)
28       {
29         sym = valtable[from - 1];
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 - 1] != null)
52       {
53         sym = valtable[from - 1];
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 - 1] != null)
78       {
79         sym = valtable[from - 1];
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 - 1] != null)
86       {
87         sym = valtable[to - 1];
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
102     // sensitivity for insertion
103     if (from2 > 0 && valtable[from2 - 1] != null)
104       {
105         sym = valtable[from2 - 1];
106         for (i = from2 - 1; i >= 0 && valtable[i] == sym; i--)
107           valtable[i] = null;
108         for (i = from2; i < LENGTH && valtable[i] == sym; i++)
109           valtable[i] = null;
110       }
111
112     // move
113     for (i = LENGTH - 1; i >= from2 + l; i--)
114       valtable[i] = valtable[i - l];
115
116     // insert
117     for (i = from2; i < from2 + l; i++)
118       valtable[i] = valtable2[i - from2];
119     Console.WriteLine ("from {0}, to {1}, moveto {2}.\n", from, to, from2);
120
121     MText mt2 = mt.Dup ();
122     mt.Del (from, to);
123     mt.Ins (from2, mt2, from, to);
124   }
125
126   static bool Compare ()
127   {
128     for (int i = 0; i < LENGTH; i++)
129       {
130         object val = mt.GetProp (i, key);
131
132         if (valtable[i] != (MSymbol) val)
133           {
134             Console.WriteLine ("valtable[{0}] is {1}, GetProp returned {2}",
135                                i, valtable[i], val);
136             return false;
137           }
138       }
139     return true;
140   }
141
142   static void Dump ()
143   {
144     for (int i = 0; i < LENGTH; i++)
145       Console.WriteLine ("{0} {1} :", i, valtable[i]);
146   }
147
148   public static void Main (string[] args)
149   {
150     Random r = new Random (int.Parse (args[0]));
151     int check = (args.Length > 1 ? int.Parse (args[1]) : 0xFFFFFFF);
152
153     for (int loop = 0; loop < 1000000; loop++)
154       {
155         int from, to;
156
157         Console.WriteLine ("--- loop = {0} ---\n", loop);
158         if (loop >= check)
159           {
160             mt.DumpPropNested ();
161             Dump ();
162             M17n.debug = true;
163           }
164
165         do {
166           from = r.Next (LENGTH);
167           to = r.Next (LENGTH) + 1;
168         } while (from == to);
169         if (from > to)
170           {
171             int tmp = from;
172             from = to;
173             to = tmp;
174           }
175
176         MProperty prop;
177         switch (r.Next (3))
178           {
179           case 0:
180             prop = prop0;
181             break;
182           case 1:
183             prop = prop1;
184             break;
185           default:
186             prop = prop2;
187             break;
188           }
189
190         switch (r.Next (3))
191           {
192           case 0:
193             TestPushProp (from, to, prop);
194             break;
195           case 1:
196             TestPopProp (from, to, key);
197             break;
198           case 2:
199             TestDelIns (from, to, r.Next (LENGTH - (to - from) + 1));
200             break;
201           }
202
203         if (M17n.debug)
204           mt.DumpPropNested ();
205
206         if (Compare () == false)
207           {
208             Console.WriteLine ("");
209             Dump ();
210             Console.WriteLine ("Failed.");
211             return;
212           }
213       }
214   }
215 }