1// tbasic2.cpp -- Regression test program, basic tests part 2 2// $Id: tbasic2.cpp 1230 2007-03-09 15:58:53Z jcw $ 3// This is part of Metakit, the homepage is http://www.equi4.com/metakit.html 4 5#include "regress.h" 6 7static int ViewSize(c4_View v) { 8 return v.GetSize(); 9} 10 11void TestBasics2() { 12 B(b20, Search sorted view, 0) { 13 c4_IntProp p1("p1"); 14 c4_StringProp p2("p2"); 15 c4_View v1; 16 v1.Add(p1[111] + p2["one"]); 17 v1.Add(p1[222] + p2["two"]); 18 v1.Add(p1[333] + p2["three"]); 19 v1.Add(p1[345] + p2["four"]); 20 v1.Add(p1[234] + p2["five"]); 21 v1.Add(p1[123] + p2["six"]); 22 c4_View v2 = v1.Sort(); 23 A(v2.GetSize() == 6); 24 A(p1(v2[0]) == 111); 25 A(p1(v2[1]) == 123); 26 A(p1(v2[2]) == 222); 27 A(p1(v2[3]) == 234); 28 A(p1(v2[4]) == 333); 29 A(p1(v2[5]) == 345); 30 A(v2.Search(p1[123]) == 1); 31 A(v2.Search(p1[100]) == 0); 32 A(v2.Search(p1[200]) == 2); 33 A(v2.Search(p1[400]) == 6); 34 c4_View v3 = v1.SortOn(p2); 35 A(v3.GetSize() == 6); 36 A(p1(v3[0]) == 234); 37 A(p1(v3[1]) == 345); 38 A(p1(v3[2]) == 111); 39 A(p1(v3[3]) == 123); 40 A(p1(v3[4]) == 333); 41 A(p1(v3[5]) == 222); 42 A(v3.Search(p2["six"]) == 3); 43 A(v3.Search(p2["aha"]) == 0); 44 A(v3.Search(p2["gee"]) == 2); 45 A(v3.Search(p2["wow"]) == 6); 46 c4_View v4 = v1.SortOnReverse(p2, p2); 47 A(v4.GetSize() == 6); 48 A(p1(v4[0]) == 222); 49 A(p1(v4[1]) == 333); 50 A(p1(v4[2]) == 123); 51 A(p1(v4[3]) == 111); 52 A(p1(v4[4]) == 345); 53 A(p1(v4[5]) == 234); 54 A(v4.Search(p2["six"]) == 2); 55 A(v4.Search(p2["aha"]) == 6); 56 A(v4.Search(p2["gee"]) == 4); 57 A(v4.Search(p2["wow"]) == 0); 58 } 59 E; 60 61 B(b21, Memo property, 0) { 62 c4_Row r1; 63 c4_MemoProp p1("p1"); 64 c4_Bytes x1("hi!", 3); 65 66 p1(r1) = x1; 67 c4_Bytes x2 = p1(r1); 68 A(x1 == x2); 69 } 70 E; 71 72 B(b22, Stored view references, 0) { 73 c4_ViewProp p1("p1"); 74 c4_View v1; 75 76 { 77 v1.Add(p1[c4_View()]); 78 } 79 80 // this works 81 int n = ViewSize(p1.Get(v1[0])); 82 A(n == 0); 83 84 // this fails in 1.8b2 using MSVC 1.52 (tq_wvus) 85 // 86 // The compiler destructs temp c4_View once too often, or 87 // what's more likely, fails to call the constructor once. 88 // 89 // So for MSVC 1.52: use prop.Get(rowref) for subviews, 90 // or immediately assign the result to a c4_View object, 91 // do not pass a "prop (rowref)" expression as argument. 92 93#if _MSC_VER != 800 94 int m = ViewSize(p1(v1[0])); 95 A(m == 0); 96#endif 97 } 98 E; 99 100 B(b23, Sort comparison fix, 0) { // 1.9e: compare buffering problem 101 c4_DoubleProp p1("p1"); 102 c4_View v1; 103 for (int i = 0; i < 100; ++i) 104 v1.Add(p1[99-i]); 105 c4_View v2 = v1.Sort(); 106 A(v2.GetSize() == 100); 107 for (int j = 0; j < 100; ++j) { 108 A(p1(v1[j]) == (double)99-j); 109 A(p1(v2[j]) == (double)j); 110 } 111 } 112 E; 113 114 B(b24, Custom view comparisons, 0) { // 1.9f: more compare cache problems 115 c4_IntProp p1("p1"); 116 c4_FloatProp p2("p2"); 117 c4_DoubleProp p3("p3"); 118 c4_IntProp p4("p4"); 119 c4_View v1; 120 v1.Add(p1[2] + p2[2] + p3[2]); 121 v1.Add(p1[1] + p2[1] + p3[1]); 122 v1.Add(p1[3] + p2[3] + p3[3]); 123 A(v1.GetSize() == 3); 124 A((int)p1(v1[0]) > (int)p1(v1[1])); 125 A((float)p2(v1[0]) > (float)p2(v1[1])); 126 A((double)p3(v1[0]) > (double)p3(v1[1])); 127 A((int)p1(v1[0]) < (int)p1(v1[2])); 128 A((float)p2(v1[0]) < (float)p2(v1[2])); 129 A((double)p3(v1[0]) < (double)p3(v1[2])); 130 c4_View v2 = v1.Unique(); 131 A(v2.GetSize() == 3); 132 A((int)p1(v2[0]) != (int)p1(v2[1])); 133 A((float)p2(v2[0]) != (float)p2(v2[1])); 134 A((double)p3(v2[0]) != (double)p3(v2[1])); 135 A((int)p1(v2[0]) != (int)p1(v2[2])); 136 A((float)p2(v2[0]) != (float)p2(v2[2])); 137 A((double)p3(v2[0]) != (double)p3(v2[2])); 138 v1.Add(p1[2] + p2[2] + p3[2]); 139 v1.Add(p1[1] + p2[1] + p3[1]); 140 v1.Add(p1[3] + p2[3] + p3[3]); 141 c4_View v3 = v1.Unique(); 142 A(v3.GetSize() == 3); 143 A((int)p1(v3[0]) != (int)p1(v3[1])); 144 A((float)p2(v3[0]) != (float)p2(v3[1])); 145 A((double)p3(v3[0]) != (double)p3(v3[1])); 146 A((int)p1(v3[0]) != (int)p1(v3[2])); 147 A((float)p2(v3[0]) != (float)p2(v3[2])); 148 A((double)p3(v3[0]) != (double)p3(v3[2])); 149 c4_View v4 = v1.Counts(p1, p4); 150 A(v4.GetSize() == 3); 151 c4_View v5 = v1.Counts(p2, p4); 152 A(v5.GetSize() == 3); // this failed in 1.9f 153 c4_View v6 = v1.Counts(p3, p4); 154 A(v6.GetSize() == 3); // this failed in 1.9f 155 } 156 E; 157 158 B(b25, Copy row from derived, 0) { 159 c4_IntProp p1("p1"); 160 c4_View v1; 161 v1.Add(p1[111]); 162 v1.Add(p1[222]); 163 v1.Add(p1[333]); 164 c4_View v2 = v1.Select(p1[222]); 165 A(v2.GetSize() == 1); 166 A(p1(v2[0]) == 222); 167 c4_Row r = v2[0]; 168 A(p1(r) == 222); // 1.9g: failed because SetAt did not remap 169 } 170 E; 171 172 B(b26, Partial memo field access, 0) { 173 c4_BytesProp p1("p1"); 174 c4_View v1; 175 v1.Add(p1[c4_Bytes("12345", 5)]); 176 A(v1.GetSize() == 1); 177 c4_Bytes buf = p1(v1[0]); 178 A(buf.Size() == 5); 179 A(buf == c4_Bytes("12345", 5)); 180 buf = p1(v1[0]).Access(1, 3); 181 A(buf == c4_Bytes("234", 3)); 182 p1(v1[0]).Modify(c4_Bytes("ab", 2), 2, 0); 183 buf = p1(v1[0]); 184 A(buf == c4_Bytes("12ab5", 5)); 185 p1(v1[0]).Modify(c4_Bytes("ABC", 3), 1, 2); 186 buf = p1(v1[0]); 187 A(buf == c4_Bytes("1ABCab5", 7)); 188 p1(v1[0]).Modify(c4_Bytes("xyz", 3), 2, - 2); 189 buf = p1(v1[0]); 190 A(buf == c4_Bytes("1Axyz", 5)); 191 p1(v1[0]).Modify(c4_Bytes("3456", 4), 4, 0); 192 buf = p1(v1[0]); 193 A(buf == c4_Bytes("1Axy3456", 8)); 194 } 195 E; 196 197 B(b27, Copy value to another row, 0) { 198 c4_StringProp p1("p1"); 199 c4_View v1; 200 v1.SetSize(2); 201 p1(v1[1]) = "abc"; 202 // next assert fails in MacOS X 10.2.1 "Jaguar" with 2.4.7 203 // seems bug in gcc 3.1, -O i.s.o. -O2 works [jcw 21oct02] 204 A((const char*)(p1(v1[0])) == (c4_String)""); 205 A((const char*)(p1(v1[1])) == (c4_String)"abc"); 206 207 // fails in 2.4.0, reported by Jerry McRae, August 2001 208 p1(v1[0]) = (const char*)p1(v1[1]); 209 // MacOS 10.2.3 gcc 3.1 dec 2002 is still weird, inserting the 210 // following code (which should be a noop) *fixes* the assert! 211 //const char* q = p1 (v1[1]); 212 A((c4_String)(const char*)(p1(v1[0])) == (c4_String)"abc"); 213 } 214 E; 215} 216