github.com/mgulsoy/arnedb@v1.2.2-alpha/arnedb_test.go (about) 1 package arnedb 2 3 import ( 4 "fmt" 5 "os" 6 "testing" 7 "time" 8 ) 9 10 type SampleNestedType struct { 11 IntegerValue int 12 StringValue string 13 FloatValue float64 14 } 15 16 type SampleRecordType struct { 17 Id int 18 Name string 19 Nested SampleNestedType 20 ArrayValue []string 21 } 22 23 func TestOpen(t *testing.T) { 24 pDb, err := Open("/tmp/arnedb", "testdb") 25 26 if pDb == nil || err != nil { 27 t.Fatal("Open test failed with:", err) 28 } 29 30 } 31 32 func TestCollectionOperations(t *testing.T) { 33 34 _ = os.RemoveAll("/tmp/arnedb/testdb") 35 36 // Veritabanı open yapılır 37 pDb, err := Open("/tmp/arnedb", "testdb") 38 if pDb == nil || err != nil { 39 t.Fatal("Open test failed with:", err) 40 } 41 42 // Request a collection that is not present 43 nec := pDb.GetColl("non-existent") 44 if nec == nil { 45 t.Log("Request non-existent collection success") 46 } 47 48 // birinci adlı kolleksiyon oluşturulur 49 birinci, err := pDb.CreateColl("birinci") 50 if err != nil { 51 t.Error("Create birinci failed with:", err) 52 } 53 54 // ikinci adlı kolleksiyon oluşturulur 55 _, err = pDb.CreateColl("ikinci") 56 if err != nil { 57 t.Error("Create ikinci failed with:", err) 58 } 59 60 // üçüncü adlı kolleksiyon oluşturulur 61 ucuncu, err := pDb.CreateColl("üçüncü") 62 if err != nil { 63 t.Error("Create üçüncü failed with:", err) 64 } 65 66 err = pDb.DeleteColl("ikinci") 67 if err != nil { 68 t.Error("Delete ikinci failed with:", err) 69 } 70 71 // Olmayan bir tane kolleksiyon silmeyi deneriz. 72 err = pDb.DeleteColl("hebele") 73 if err != nil { 74 // bu beklenen bir sonuç 75 t.Log("Delete non-existent coll resulted with error as expected. Msg:", err) 76 } 77 78 // Kolleksiyona birkaç tane kayıt ekleriz 79 e1 := make(map[string]interface{}) 80 e1["id"] = 34 81 e1["name"] = "deneme" 82 e1["user"] = "mert" 83 e1["unixtime"] = time.Now().Unix() 84 85 err = birinci.Add(e1) 86 if err != nil { 87 t.Fatal("Add(1) Failed with: ", err) 88 } 89 90 e2 := make(map[string]interface{}) 91 e2["id"] = 35 92 e2["name"] = "hasan" 93 e2["user"] = "mert" 94 e2["unixtime"] = time.Now().Unix() 95 err = birinci.Add(e2) 96 if err != nil { 97 t.Fatal("Add(2) Failed with: ", err) 98 } 99 100 e3 := make(map[string]interface{}) 101 e3["id"] = 36 102 e3["name"] = "Multiline\ndata" 103 e3["user"] = "sülüman" 104 e3["unixtime"] = time.Now().Unix() 105 err = birinci.Add(e3) 106 if err != nil { 107 t.Fatal("Add(3) Failed with: ", err) 108 } 109 110 e4 := make(map[string]interface{}) 111 e4["id"] = 40 112 e4["name"] = "Mud,ata" 113 e4["user"] = "sülümanos 40" 114 e4["unixtime"] = time.Now().Unix() 115 err = birinci.Add(e4) 116 if err != nil { 117 t.Fatal("Add(4) Failed with: ", err) 118 } 119 120 // Get the count of 'birinci' collection 121 qCount := func(q RecordInstance) bool { 122 return true 123 } 124 125 bcount, err := birinci.Count(qCount) 126 if err != nil { 127 t.Error("Failed to get count: ", err.Error()) 128 } else { 129 t.Log(fmt.Sprintf("Expected count: %d", bcount)) 130 } 131 132 t1 := SampleRecordType{ 133 Id: 12, 134 Name: "First Sample Type Instance", 135 ArrayValue: []string{"one", "two", "three"}, 136 Nested: SampleNestedType{ 137 IntegerValue: 32, 138 StringValue: "Nested string", 139 FloatValue: 32.45, 140 }, 141 } 142 143 t2 := SampleRecordType{ 144 Id: 13, 145 Name: "Second Sample Type Instance", 146 ArrayValue: []string{"four", "five", "six"}, 147 Nested: SampleNestedType{ 148 IntegerValue: 52, 149 StringValue: "Another nested string", 150 FloatValue: 12.3456, 151 }, 152 } 153 154 // Veri sorgulanır: 155 // Hatalı sorgulama: Olmayan bir alan istenir 156 nper, err := birinci.GetFirst(func(instance RecordInstance) bool { 157 return instance["idc"].(float64) > 34 158 }) 159 if err != nil { 160 t.Log("Non-existent field error recovery OK. Result:", nper, " Error:", err) 161 } 162 163 // Normal Sorgulama 164 dd, err := birinci.GetFirst(func(instance RecordInstance) bool { 165 return instance["id"].(float64) > 34 166 }) 167 168 if err != nil { 169 t.Fatal("Error querying:", err) 170 } 171 if dd == nil { 172 t.Error("No data returned") 173 } 174 175 t.Logf("GetFirst(id>34) query result: %+v", dd) 176 177 de, err := birinci.GetAll(func(instance RecordInstance) bool { 178 return instance["id"].(float64) > 34 179 }) 180 if err != nil { 181 t.Fatal("Error querying:", err) 182 } 183 184 if de == nil { 185 t.Error("No data returned") 186 } else { 187 if len(de) == 0 { 188 t.Error("Empty GetAll result set.") 189 } else { 190 t.Log("GetAll query results:") 191 for _, item := range de { 192 t.Logf("\t\t id: %.0f", item["id"]) 193 } 194 } 195 } 196 197 // kayıt silme işlemi 36 id'li kayıt silinir. 198 dn, err := birinci.DeleteFirst(func(instance RecordInstance) bool { 199 return instance["id"].(float64) == 36 200 }) 201 if err != nil { 202 t.Fatal("Error querying:", err) 203 } else { 204 if dn == 1 { 205 t.Log("DeleteFirst operation successful.") 206 } else { 207 t.Error("DeleteFirst operation failed! n=", dn) 208 } 209 } 210 211 // Tümünü silme işlemi 212 n, err := birinci.DeleteAll(func(instance RecordInstance) bool { 213 return instance["id"].(float64) < 40 214 }) 215 if err != nil { 216 t.Fatal("Error querying:", err) 217 } else { 218 t.Logf("DeleteAll operation removed %d records\n", n) 219 } 220 221 // silme işleminden sonra yeniden sorgulama 222 dd, err = birinci.GetFirst(func(instance RecordInstance) bool { 223 return instance["id"].(float64) > 35 224 }) 225 226 if err != nil { 227 t.Fatal("Error querying:", err) 228 } 229 230 if dd == nil { 231 t.Error("No data returned") 232 } 233 234 t.Logf("GetFirst(id>34) after delete query result (expect id=40): %+v ", dd) 235 236 // Tümünü ekleme işlemi 237 dataArray := []RecordInstance{e1, e2, e3, e4} 238 239 nAddAll, err := birinci.AddAll(dataArray...) 240 if err != nil { 241 t.Error("Cannot 'AddAll'", err) 242 } else { 243 t.Logf("AddAll successful. %d records added.", nAddAll) 244 } 245 246 // Update 247 ff := func(instance RecordInstance) bool { 248 return instance["id"].(float64) == 34 249 } 250 251 e1["name"] = "ReplaceFirst yapıldı" 252 n, err = birinci.ReplaceFirst(ff, e1) 253 if err != nil { 254 t.Error("Cannot ReplaceFirst:", err) 255 } else { 256 if n == 1 { 257 t.Log("ReplaceFirst successful.") 258 } else { 259 t.Error("ReplaceFirst did not return 1 as expected!") 260 } 261 } 262 263 f2 := func(instance RecordInstance) bool { 264 return instance["user"] == "mert" 265 } 266 e2["user"] = "ReplaceAll Yapıldı" 267 n, err = birinci.ReplaceAll(f2, e2) 268 if err != nil { 269 t.Error("ReplaceAll failed! ", err) 270 } else { 271 if n == 0 { 272 t.Error("ReplaceAll returned 0 records updated. 2 expected") 273 } else { 274 t.Log("ReplaceAll successful.") 275 } 276 } 277 278 f36 := QueryPredicate(func(i RecordInstance) bool { 279 return i["id"].(float64) == 36 280 }) 281 fUpdt := UpdateFunc(func(ptrRecord *RecordInstance) *RecordInstance { 282 (*ptrRecord)["user"] = "Updated Single" 283 return ptrRecord 284 }) 285 286 n, err = birinci.UpdateFirst(f36, fUpdt) 287 if err != nil { 288 t.Error("UpdateFirst failed") 289 } else { 290 if n == 0 { 291 t.Error("UpdateFirst returned 0 records updated. 1 expected") 292 } else { 293 t.Log("UpdateFirst successful.") 294 } 295 } 296 297 f40 := QueryPredicate(func(i RecordInstance) bool { 298 return i["id"].(float64) == 40 299 }) 300 fUpdt40 := UpdateFunc(func(ptrRecord *RecordInstance) *RecordInstance { 301 (*ptrRecord)["user"] = "Updated All" 302 return ptrRecord 303 }) 304 305 n, err = birinci.UpdateAll(f40, fUpdt40) 306 if err != nil { 307 t.Error("UpdateAll failed") 308 } else { 309 if n == 0 { 310 t.Error("UpdateAll returned 0 records updated. 2 expected") 311 } else { 312 t.Log("UpdateAll successful.") 313 } 314 } 315 316 // typed structure tests 317 err = ucuncu.Add(t1) 318 if err != nil { 319 t.Fatal("Failed adding typed structure t1:", err.Error()) 320 } 321 322 err = ucuncu.Add(t2) 323 if err != nil { 324 t.Fatal("Failed adding typed structure t2:", err.Error()) 325 } 326 327 t.Log("t1 and t1 Add success") 328 329 recordAs, err := GetFirstAs[SampleRecordType](ucuncu, func(i *SampleRecordType) bool { 330 return i.Id == 13 331 }) 332 if err != nil { 333 t.Fatal("Error on generics request:", err.Error()) 334 } else { 335 if recordAs != nil { 336 t.Log("GetFirstAs: ", recordAs.Id, recordAs.Name, " Success") 337 } else { 338 t.Log("GetFirstAs: No records found. Success") 339 } 340 341 } 342 343 startMark := time.Now() 344 recordsAs, err := GetAllAs[SampleRecordType](ucuncu, func(i *SampleRecordType) bool { 345 return true // we want all 346 }) 347 if err != nil { 348 t.Fatal("Error on generics get all: ", err.Error()) 349 } else { 350 diff := time.Now().Sub(startMark) 351 t.Log("Success GetAllAs. Len: ", len(recordsAs), diff) 352 } 353 354 //Query typed structure 355 var rt1 SampleRecordType 356 var rtPredicate = func(instance interface{}) bool { 357 //fmt.Println("type of instance: ", reflect.TypeOf(instance)) 358 i := instance.(*SampleRecordType) // this typecast is required 359 return i.Id == 13 360 } 361 found, err := ucuncu.GetFirstAsInterface(rtPredicate, &rt1) 362 if err != nil { 363 t.Fatal("Error on interface request:", err.Error()) 364 } 365 366 if found { 367 t.Logf("Record found: %+v", rt1) 368 } else { 369 t.Log("Record not found.") 370 } 371 372 startMark = time.Now() 373 var rt2Predicate = func(instance interface{}) bool { 374 //fmt.Println("type of instance: ", reflect.TypeOf(instance)) 375 //i := instance.(*SampleRecordType) // this typecast is required 376 return true 377 } 378 379 var resultCollection = make([]SampleRecordType, 0) 380 var rt2FoundCallback = func(instance interface{}) bool { 381 i := *instance.(*SampleRecordType) 382 resultCollection = append(resultCollection, i) 383 return true 384 } 385 386 n, err = ucuncu.GetAllAsInterface(rt2Predicate, rt2FoundCallback, &rt1) 387 if err != nil { 388 t.Fatal("Error on interface request:", err.Error()) 389 } 390 391 if n > 0 { 392 diff := time.Now().Sub(startMark) 393 t.Logf("%d Records found: %T, %s", n, resultCollection, diff) 394 for _, k := range resultCollection { 395 t.Logf("\t ->%T : %+v", k, k) 396 } 397 } else { 398 t.Log("Record not found.") 399 } 400 401 } 402 403 func BenchmarkMemAndGenerics(b *testing.B) { 404 b.ReportAllocs() 405 pDb, err := Open("/tmp/arnedb", "testdb") 406 if pDb == nil || err != nil { 407 b.Fatal("Open test failed with:", err) 408 } 409 410 ucuncu := pDb.GetColl("üçüncü") 411 if ucuncu == nil { 412 b.Error("Create üçüncü failed with:", err) 413 } 414 415 recordAs, err := GetFirstAs[SampleRecordType](ucuncu, func(i *SampleRecordType) bool { 416 return i.Id == 36 417 }) 418 if err != nil { 419 b.Fatal("Error on interface request:", err.Error()) 420 } else { 421 b.Log("GetFirstAs: ", recordAs.Id, recordAs.Name, " Success") 422 } 423 424 }