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