1 module miao..string.test;
2 
3 version(unittest) {
4     private auto runTpl(alias fnTpl)()
5     {
6         assert(fnTpl([1, 2], [0, 1, 2]) == -1);
7         assert(fnTpl([0, 1, 2], [1, 2]) == 1);
8 
9         immutable x = [1, 2, 3];
10         assert(fnTpl([1, 2, 3, 4], x) == 0);
11 
12         const(int)[] y = [1, 2, 3];
13         assert(fnTpl([1, 2, 3, 4], y) == 0);
14     }
15 
16     private auto runCreate(alias T)()
17     {
18         auto a = T!(string)("");
19         const b = T!(string)("");
20         immutable c = T!(string)("");
21     }
22 
23 	private auto runTest(alias fn) ()
24 	{
25 		const haystack1 = "NOW AN FOWE\220ER ANNMAN THE ANPANMANEND";
26 		const needle1 = "ANPANMAN";
27 		const needle2 = "MAN THE";
28 		const needle3 = "WE\220ER";
29 		const needle4 = "NOW ";
30 		const needle5 = "NEND";
31 		const needle6 = "NOT FOUND";
32 		const needle7 = "NOT FO\340ND";
33 
34 		const haystack2 = "ABC ABCDAB ABCDABCDABDE";
35 		const needle11 = "ABCDABD";
36 			
37 		const haystack3 = "abra abracad abracadabra";
38 		const needle12 = "abracadabra";
39 		const needle13 = "";
40 
41 		const haystack4 = "";
42 
43 		import std.conv : to;
44 
45 		assert(fn("", "") == -1);
46 		assert(fn("abc", "") == -1);
47 		assert(fn("", " ") == -1);
48 
49 		assert(fn("abc", "a") == 0);
50 		assert(fn("abcd", "bc") == 1, fn("abcd", "bc").to!string);
51 
52 		assert(fn(haystack1, needle1) == 26);
53 		assert(fn(haystack1, needle2) == 18);
54 		assert(fn(haystack1, needle3) == 9);
55 		assert(fn(haystack1, needle4) == 0);
56 		assert(fn(haystack1, needle5) == 33);
57 		assert(fn(haystack1, needle6) == -1);
58 		assert(fn(haystack1, needle7) == -1);
59 			
60 		assert(fn(needle1, haystack1) == -1);
61 
62 		assert(fn(haystack1, haystack1) == 0, fn(haystack1, haystack1).to!string);
63 		assert(fn(haystack2, haystack2) == 0);
64 
65 		assert(fn(haystack2, needle11) == 15, fn(haystack2, needle11).to!string);
66 		assert(fn(haystack3, needle12) == 13);
67 
68 		assert(fn(haystack1, needle13) == -1);
69 		assert(fn(haystack4, needle1) == -1);
70 
71 		assert(fn("GCATCGCAGAGAGTATACAGTACG", "GCAGAGAG") == 5);
72 	}	
73 
74     auto testAll(alias Type, alias Searcher)()
75     {
76         import std.stdio;
77 
78         writeln("Test ", Type.stringof);
79 
80         runTest!Searcher();
81         runCreate!Type();
82         runTpl!Searcher();
83         writeln("\tTest Passed!\n");
84     }
85 }