OSDN Git Service

バージョンナンバーを増やした
[fooeditengine/FooEditEngine.git] / WPF / UnitTest / DocumentTest.cs
1 /*
2  * Copyright (C) 2013 FooProject
3  * * This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
5
6  * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 
7  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
8
9 You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
10  */
11 using System;
12 using System.Linq;
13 using System.Text.RegularExpressions;
14 using System.Collections.Generic;
15 using Microsoft.VisualStudio.TestTools.UnitTesting;
16 using FooEditEngine;
17
18 namespace UnitTest
19 {
20     [TestClass]
21     public class DocumentTest
22     {
23         [TestMethod]
24         public void InsertSingleLineTest()
25         {
26             DummyRender render = new DummyRender();
27             Document doc = new Document();
28             doc.LayoutLines.Render = render;
29             DummyView view = new DummyView(doc, render);
30             doc.Clear();
31             doc.Append("a\nb\nc\nd");
32             Assert.IsTrue(view.LayoutLines[0] == "a\n" &&
33                 view.LayoutLines[1] == "b\n" &&
34                 view.LayoutLines[2] == "c\n" &&
35                 view.LayoutLines[3] == "d");
36
37             doc.Insert(2, "x");
38             Assert.IsTrue(view.LayoutLines[0] == "a\n" &&
39                 view.LayoutLines[1] == "xb\n" &&
40                 view.LayoutLines[2] == "c\n" &&
41                 view.LayoutLines[3] == "d");
42
43             doc.Insert(3, "x");
44             Assert.IsTrue(view.LayoutLines[0] == "a\n" &&
45                 view.LayoutLines[1] == "xxb\n" &&
46                 view.LayoutLines[2] == "c\n" &&
47                 view.LayoutLines[3] == "d");
48
49             doc.Insert(6, "x");
50             Assert.IsTrue(view.LayoutLines[0] == "a\n" &&
51                 view.LayoutLines[1] == "xxb\n" &&
52                 view.LayoutLines[2] == "xc\n" &&
53                 view.LayoutLines[3] == "d");
54
55             doc.Insert(0, "x");
56             Assert.IsTrue(view.LayoutLines[0] == "xa\n" &&
57                 view.LayoutLines[1] == "xxb\n" &&
58                 view.LayoutLines[2] == "xc\n" &&
59                 view.LayoutLines[3] == "d");
60
61         }
62
63         [TestMethod]
64         public void InsertMultiLineTest()
65         {
66             DummyRender render = new DummyRender();
67             Document doc = new Document();
68             doc.LayoutLines.Render = render;
69             DummyView view = new DummyView(doc, render);
70
71             doc.Clear();
72             doc.Append("a\nb\nc\nd");
73
74             doc.Insert(2, "f\ne");
75             Assert.IsTrue(
76                 view.LayoutLines[0] == "a\n" &&
77                 view.LayoutLines[1] == "f\n" &&
78                 view.LayoutLines[2] == "eb\n" &&
79                 view.LayoutLines[3] == "c\n" &&
80                 view.LayoutLines[4] == "d");
81
82             doc.Insert(3, "g\nh");
83             Assert.IsTrue(
84                 view.LayoutLines[0] == "a\n" &&
85                 view.LayoutLines[1] == "fg\n" &&
86                 view.LayoutLines[2] == "h\n" &&
87                 view.LayoutLines[3] == "eb\n" &&
88                 view.LayoutLines[4] == "c\n" &&
89                 view.LayoutLines[5] == "d");
90
91             doc.Insert(0, "x\ny");
92             Assert.IsTrue(
93                 view.LayoutLines[0] == "x\n" &&
94                 view.LayoutLines[1] == "ya\n" &&
95                 view.LayoutLines[2] == "fg\n" &&
96                 view.LayoutLines[3] == "h\n" &&
97                 view.LayoutLines[4] == "eb\n" &&
98                 view.LayoutLines[5] == "c\n" &&
99                 view.LayoutLines[6] == "d");
100         }
101
102         [TestMethod]
103         public void RemoveSingleLineTest()
104         {
105             DummyRender render = new DummyRender();
106             Document doc = new Document();
107             doc.LayoutLines.Render = render;
108             DummyView view = new DummyView(doc, render);
109             doc.Clear();
110             doc.Append("aa\nbb\ncc\ndd");
111
112             doc.Remove(9, 1);
113             Assert.IsTrue(
114                 view.LayoutLines[0] == "aa\n" &&
115                 view.LayoutLines[1] == "bb\n" &&
116                 view.LayoutLines[2] == "cc\n" &&
117                 view.LayoutLines[3] == "d"
118                 );
119
120             doc.Remove(9, 1);
121             Assert.IsTrue(
122                 view.LayoutLines[0] == "aa\n" &&
123                 view.LayoutLines[1] == "bb\n" &&
124                 view.LayoutLines[2] == "cc\n" &&
125                 view.LayoutLines[3] == ""
126                 );
127
128             doc.Remove(0, 1);
129             Assert.IsTrue(
130                 view.LayoutLines[0] == "a\n" &&
131                 view.LayoutLines[1] == "bb\n" &&
132                 view.LayoutLines[2] == "cc\n" &&
133                 view.LayoutLines[3] == ""
134                 );
135         }
136
137         [TestMethod]
138         public void RemoveMultiLineTest()
139         {
140             DummyRender render = new DummyRender();
141             Document doc = new Document();
142             doc.LayoutLines.Render = render;
143             DummyView view = new DummyView(doc, render);
144
145             doc.Clear();
146             doc.Append("a\n");
147             doc.Append("b\n");
148             doc.Append("c\n");
149             doc.Append("d\n");
150             doc.Append("e\n");
151             doc.Append("f\n");
152
153             doc.Remove(2, 4);
154             Assert.IsTrue(
155                 view.LayoutLines[0] == "a\n" &&
156                 view.LayoutLines[1] == "d\n" &&
157                 view.LayoutLines[2] == "e\n" &&
158                 view.LayoutLines[3] == "f\n");
159
160             doc.Remove(4, 4);
161             Assert.IsTrue(
162                 view.LayoutLines[0] == "a\n" &&
163                 view.LayoutLines[1] == "d\n");
164
165             doc.Clear();
166             doc.Append("a\n");
167             doc.Append("b\n");
168             doc.Append("c\n");
169             doc.Append("d\n");
170
171             doc.Remove(2, 6);
172             Assert.IsTrue(view.LayoutLines[0] == "a\n");
173
174             doc.Clear();
175             doc.Append("a\n");
176             doc.Append("b\n");
177             doc.Append("c\n");
178             doc.Append("d\n");
179             doc.Append("e\n");
180             doc.Append("f\n");
181             doc.Insert(4, "a");
182             doc.Remove(2, 5);
183             Assert.IsTrue(
184                 view.LayoutLines[0] == "a\n" &&
185                 view.LayoutLines[1] == "d\n" &&
186                 view.LayoutLines[2] == "e\n" &&
187                 view.LayoutLines[3] == "f\n");
188         }
189
190         [TestMethod]
191         public void QueryTest()
192         {
193             DummyRender render = new DummyRender();
194             Document doc = new Document();
195             doc.LayoutLines.Render = render;
196             DummyView view = new DummyView(doc, render);
197             doc.Clear();
198             doc.Append("a\nb\nc");
199
200             Assert.IsTrue(view.LayoutLines.GetIndexFromLineNumber(1) == 2);
201             Assert.IsTrue(view.LayoutLines.GetLengthFromLineNumber(1) == 2);
202             Assert.IsTrue(view.LayoutLines.GetLineNumberFromIndex(2) == 1);
203             TextPoint tp = view.LayoutLines.GetTextPointFromIndex(2);
204             Assert.IsTrue(tp.row == 1 && tp.col == 0);
205             Assert.IsTrue(view.LayoutLines.GetIndexFromTextPoint(tp) == 2);
206
207             doc.Insert(2, "a");
208
209             Assert.IsTrue(view.LayoutLines.GetIndexFromLineNumber(2) == 5);
210             Assert.IsTrue(view.LayoutLines.GetLineNumberFromIndex(5) == 2);
211             tp = view.LayoutLines.GetTextPointFromIndex(5);
212             Assert.IsTrue(tp.row == 2 && tp.col == 0);
213             Assert.IsTrue(view.LayoutLines.GetIndexFromTextPoint(tp) == 5);
214
215             doc.Insert(0, "a");
216
217             Assert.IsTrue(view.LayoutLines.GetIndexFromLineNumber(2) == 6);
218             Assert.IsTrue(view.LayoutLines.GetLineNumberFromIndex(6) == 2);
219             tp = view.LayoutLines.GetTextPointFromIndex(6);
220             Assert.IsTrue(tp.row == 2 && tp.col == 0);
221             Assert.IsTrue(view.LayoutLines.GetIndexFromTextPoint(tp) == 6);
222         }
223
224         [TestMethod]
225         public void FindTest1()
226         {
227             DummyRender render = new DummyRender();
228             Document doc = new Document();
229             doc.LayoutLines.Render = render;
230             doc.Append("is this a pen");
231             doc.SetFindParam("is", false, RegexOptions.None);
232             IEnumerator<SearchResult> it = doc.Find();
233             it.MoveNext();
234             SearchResult sr = it.Current;
235             Assert.IsTrue(sr.Start == 0 && sr.End == 1);
236             it.MoveNext();
237             sr = it.Current;
238             Assert.IsTrue(sr.Start == 5 && sr.End == 6);
239         }
240
241         [TestMethod]
242         public void FindTest2()
243         {
244             DummyRender render = new DummyRender();
245             Document doc = new Document();
246             doc.LayoutLines.Render = render;
247             doc.Append("is this a pen");
248             doc.SetFindParam("is", false, RegexOptions.None);
249             IEnumerator<SearchResult> it = doc.Find(3,4);
250             it.MoveNext();
251             SearchResult sr = it.Current;
252             Assert.IsTrue(sr.Start == 5 && sr.End == 6);
253         }
254
255         [TestMethod]
256         public void FindTest3()
257         {
258             DummyRender render = new DummyRender();
259             Document doc = new Document();
260             doc.LayoutLines.Render = render;
261             doc.Append("is this a pen");
262             doc.SetFindParam("is", false, RegexOptions.None);
263             IEnumerator<SearchResult> it = doc.Find(0, 8);
264             it.MoveNext();
265             SearchResult sr = it.Current;
266             doc.Replace(sr.Start, sr.End - sr.Start + 1, "aaa");
267             it.MoveNext();
268             sr = it.Current;
269             Assert.IsTrue(sr.Start == 6 && sr.End == 7);
270         }
271
272         [TestMethod]
273         public void ReaderTest1()
274         {
275             DummyRender render = new DummyRender();
276             Document doc = new Document();
277             doc.LayoutLines.Render = render;
278             doc.Append("a");
279             DocumentReader reader = doc.CreateReader();
280             Assert.IsTrue(reader.Read() == 'a');
281             Assert.IsTrue(reader.Peek() == -1);
282         }
283
284         [TestMethod]
285         public void ReaderTest2()
286         {
287             DummyRender render = new DummyRender();
288             Document doc = new Document();
289             doc.LayoutLines.Render = render;
290             doc.Append("abc");
291             DocumentReader reader = doc.CreateReader();
292             char[] buf = new char[2];
293             int count = reader.Read(buf,1,2);
294             Assert.IsTrue(buf[0] == 'b' && buf[1] == 'c');
295             Assert.IsTrue(count == 2);
296             Assert.IsTrue(reader.Peek() == -1);
297         }
298
299         [TestMethod]
300         public void GetLinesText()
301         {
302             DummyRender render = new DummyRender();
303             Document doc = new Document();
304             doc.LayoutLines.Render = render;
305             doc.Append("a\nb\nc");
306             var result = doc.GetLines(0, doc.Length - 1).ToArray();
307             Assert.AreEqual("a\n", result[0]);
308             Assert.AreEqual("b\n", result[1]);
309             Assert.AreEqual("c", result[2]);
310         }
311
312         [TestMethod]
313         public void IndexOfText()
314         {
315             StringBuffer buf = new StringBuffer();
316             string str = "this is a pen";
317             buf.Replace(0, 0, str, str.Length);
318             
319             int index = buf.IndexOf("is", 0);
320             Assert.IsTrue(index == 2);
321             
322             index = buf.IndexOf("is", 4);
323             Assert.IsTrue(index == 5);
324             
325             index = buf.IndexOf("xy", 0);
326             Assert.IsTrue(index == -1);
327
328             index = buf.IndexOf("Is", 0,true);
329             Assert.IsTrue(index == 2);
330
331             str = "xABC";
332             buf.Clear();
333             buf.Replace(0, 0, str, str.Length);
334             index = buf.IndexOf("ABC", 0);
335             Assert.IsTrue(index == 1);
336
337             index = buf.IndexOf("abc", 0,true);
338             Assert.IsTrue(index == 1);
339
340             index = buf.IndexOf("abc", 0);
341             Assert.IsTrue(index == -1);
342         }
343
344         [TestMethod]
345         public void ReplaceNonRegexAllTest()
346         {
347             DummyRender render = new DummyRender();
348             Document doc = new Document();
349             doc.LayoutLines.Render = render;
350             doc.Append("this is a pen\n");
351             doc.Append("this is a pen\n");
352             doc.SetFindParam("is", false, RegexOptions.None);
353             doc.ReplaceAll("aaa", false);
354             Assert.IsTrue(doc.ToString(0) == "thaaa aaa a pen\nthaaa aaa a pen\n");
355         }
356
357         [TestMethod]
358         public void ReplaceRegexAllTest()
359         {
360             DummyRender render = new DummyRender();
361             Document doc = new Document();
362             doc.LayoutLines.Render = render;
363             doc.Append("this is a pen\n");
364             doc.Append("this is a pen\n");
365             doc.SetFindParam("[a-z]+", true, RegexOptions.None);
366             doc.ReplaceAll("aaa", false);
367             Assert.IsTrue(doc.ToString(0) == "aaa aaa aaa aaa\naaa aaa aaa aaa\n");
368         }
369
370         [TestMethod]
371         public void ReplaceAllTest()
372         {
373             DummyRender render = new DummyRender();
374             Document doc = new Document();
375             doc.LayoutLines.Render = render;
376             doc.Append("this is a pen");
377             doc.ReplaceAll2("is", "aaa");
378             Assert.IsTrue(doc.ToString(0) == "thaaa aaa a pen");
379         }
380
381         [TestMethod]
382         public void MarkerTest()
383         {
384             DummyRender render = new DummyRender();
385             Document doc = new Document();
386             doc.LayoutLines.Render = render;
387             doc.Append("this is a pen");
388             doc.SetMarker(MarkerIDs.Defalut, Marker.Create(0, 4, HilightType.Sold));
389
390             var markers = doc.Markers.Get(MarkerIDs.Defalut);
391             foreach(var m in markers)
392                 Assert.IsTrue(m.start == 0 && m.length == 4);
393
394             doc.SetMarker(MarkerIDs.Defalut, Marker.Create(5, 2, HilightType.Sold));
395             doc.RemoveMarker(MarkerIDs.Defalut, 0, 4);
396             markers = doc.Markers.Get(MarkerIDs.Defalut);
397             foreach (var m in markers)
398                 Assert.IsTrue(m.start == 5 && m.length == 2);
399
400             doc.Insert(5, "a");
401             markers = doc.Markers.Get(MarkerIDs.Defalut, 0);
402             foreach (var m in markers)
403                 Assert.IsTrue(m.start == 6 && m.length == 2);
404
405             doc.Insert(10, "a");
406             markers = doc.Markers.Get(MarkerIDs.Defalut, 0);
407             foreach (var m in markers)
408                 Assert.IsTrue(m.start == 6 && m.length == 2);
409
410             doc.SetMarker(MarkerIDs.URL, Marker.Create(0, 4, HilightType.Sold));
411             doc.Markers.Clear(MarkerIDs.Defalut);
412             foreach (int id in doc.Markers.IDs)
413             {
414                 markers = doc.Markers.Get(id, 0);
415                 foreach (var m in markers)
416                     Assert.IsTrue(m.start == 0 && m.length == 4);
417             }
418         }
419
420         [TestMethod]
421         public void WatchDogTest()
422         {
423             RegexMarkerPattern dog = new RegexMarkerPattern(new Regex("h[a-z]+"), HilightType.Url,new Color(0,0,0,255));
424             IEnumerable<Marker> result = new List<Marker>(){
425                 Marker.Create(0,4,HilightType.Url,new Color(0,0,0,255)),
426                 Marker.Create(5,4,HilightType.Url,new Color(0,0,0,255))
427             };
428             string str = "html haml";
429
430             DummyRender render = new DummyRender();
431             Document doc = new Document();
432             doc.LayoutLines.Render = render;
433             DummyView view = new DummyView(doc, render);
434             doc.MarkerPatternSet.Add(MarkerIDs.Defalut, dog);
435             doc.Clear();
436             doc.Append(str);
437             IEnumerable<Marker> actual = doc.MarkerPatternSet.GetMarkers(new CreateLayoutEventArgs(0, str.Length, str));
438             this.AreEqual(result, actual);
439         }
440
441         [TestMethod]
442         public void CallAutoIndentHookWhenEnter()
443         {
444             bool called = false;
445             Document doc = new Document();
446             doc.AutoIndentHook += (s, e) => { called = true; };
447             doc.Replace(0, 0, Document.NewLine.ToString(), true);
448             Assert.AreEqual(true, called);
449
450             called = false;
451             doc.Replace(0, 0, "aaa", true);
452             Assert.AreEqual(false, called);
453         }
454
455         [TestMethod]
456         public void SaveAndLoadFile()
457         {
458             const string content = "aaaa";
459             Document doc = new Document();
460             doc.Append(content);
461
462             System.IO.StreamWriter sw = new System.IO.StreamWriter("test.txt");
463             System.Threading.Tasks.Task t = doc.SaveAsync(sw);
464             t.Wait();
465             sw.Close();
466
467             doc.Clear();
468
469             System.IO.StreamReader sr = new System.IO.StreamReader("test.txt");
470             t = doc.LoadAsync(sr);
471             t.Wait();
472             sr.Close();
473
474             Assert.AreEqual(content, doc.ToString(0));
475         }
476
477         void AreEqual<T>(IEnumerable<T> t1, IEnumerable<T> t2)
478         {
479             Assert.AreEqual(t1.Count(), t2.Count());
480
481             IEnumerator<T> e1 = t1.GetEnumerator();
482             IEnumerator<T> e2 = t2.GetEnumerator();
483
484             while (e1.MoveNext() && e2.MoveNext())
485             {
486                 Assert.AreEqual(e1.Current, e2.Current);
487             }
488         }
489     }
490 }