@@ -119,9 +119,11 @@ func runTests(t *testing.T, name string, tests ...func(db *DBTest)) {
119
119
defer db .Close ()
120
120
121
121
environment := & DBTest {t , db }
122
+ environment .mustExec ("DROP TABLE IF EXISTS test" )
122
123
for _ , test := range tests {
123
124
test (environment )
124
125
}
126
+ environment .mustExec ("DROP TABLE IF EXISTS test" )
125
127
}
126
128
127
129
func args (args ... interface {}) []interface {} {
@@ -206,8 +208,6 @@ func _rawBytesResultExceedsBuffer(db *DBTest) {
206
208
}
207
209
208
210
func _crud (db * DBTest ) {
209
- db .mustExec ("DROP TABLE IF EXISTS test" )
210
-
211
211
// Create Table
212
212
db .mustExec ("CREATE TABLE test (value BOOL)" )
213
213
@@ -302,8 +302,6 @@ func TestInt(t *testing.T) {
302
302
}
303
303
304
304
func _int (db * DBTest ) {
305
- db .mustExec ("DROP TABLE IF EXISTS test" )
306
-
307
305
types := [5 ]string {"TINYINT" , "SMALLINT" , "MEDIUMINT" , "INT" , "BIGINT" }
308
306
in := int64 (42 )
309
307
var out int64
@@ -353,8 +351,6 @@ func TestFloat(t *testing.T) {
353
351
}
354
352
355
353
func _float (db * DBTest ) {
356
- db .mustExec ("DROP TABLE IF EXISTS test" )
357
-
358
354
types := [2 ]string {"FLOAT" , "DOUBLE" }
359
355
in := float32 (42.23 )
360
356
var out float32
@@ -384,8 +380,6 @@ func TestString(t *testing.T) {
384
380
}
385
381
386
382
func _string (db * DBTest ) {
387
- db .mustExec ("DROP TABLE IF EXISTS test" )
388
-
389
383
types := [6 ]string {"CHAR(255)" , "VARCHAR(255)" , "TINYTEXT" , "TEXT" , "MEDIUMTEXT" , "LONGTEXT" }
390
384
in := "κόσμε üöäßñóùéàâÿœ'îë Árvíztűrő いろはにほへとちりぬるを イロハニホヘト דג סקרן чащах น่าฟังเอย"
391
385
var out string
@@ -432,89 +426,111 @@ func _string(db *DBTest) {
432
426
}
433
427
434
428
func TestDateTime (t * testing.T ) {
435
- var modes = [2 ]string {"text" , "binary" }
436
- var types = [2 ]string {"DATE" , "DATETIME" }
437
- var tests = [2 ][]struct {
429
+ type testmode struct {
430
+ selectSuffix string
431
+ args []interface {}
432
+ }
433
+ type timetest struct {
438
434
in interface {}
439
435
sOut string
440
436
tOut time.Time
441
437
tIsZero bool
442
- }{
443
- {
444
- {"2012-06-14" , "2012-06-14" , time .Date (2012 , 6 , 14 , 0 , 0 , 0 , 0 , time .UTC ), false },
445
- {"0000-00-00" , "0000-00-00" , time.Time {}, true },
446
- {time .Date (2012 , 6 , 14 , 0 , 0 , 0 , 0 , time .UTC ), "2012-06-14" , time .Date (2012 , 6 , 14 , 0 , 0 , 0 , 0 , time .UTC ), false },
447
- {time.Time {}, "0000-00-00" , time.Time {}, true },
448
- },
449
- {
450
- {"2011-11-20 21:27:37" , "2011-11-20 21:27:37" , time .Date (2011 , 11 , 20 , 21 , 27 , 37 , 0 , time .UTC ), false },
451
- {"0000-00-00 00:00:00" , "0000-00-00 00:00:00" , time.Time {}, true },
452
- {time .Date (2011 , 11 , 20 , 21 , 27 , 37 , 0 , time .UTC ), "2011-11-20 21:27:37" , time .Date (2011 , 11 , 20 , 21 , 27 , 37 , 0 , time .UTC ), false },
453
- {time.Time {}, "0000-00-00 00:00:00" , time.Time {}, true },
454
- },
455
- }
456
- var sOut string
457
- var tOut time.Time
458
-
459
- var rows [2 ]* sql.Rows
460
- var err error
461
- var resultType string
438
+ }
439
+ type tester func (db * DBTest , rows * sql.Rows ,
440
+ test * timetest , sqltype , resulttype , mode string )
441
+ type setup struct {
442
+ vartype string
443
+ dsnSuffix string
444
+ test tester
445
+ }
446
+ var (
447
+ date = time .Date (2012 , 6 , 14 , 0 , 0 , 0 , 0 , time .UTC )
448
+ dstring = "2012-06-14"
449
+ datetime = time .Date (2011 , 11 , 20 , 21 , 27 , 37 , 0 , time .UTC )
450
+ dtstring = "2011-11-20 21:27:37"
451
+ date0 = time.Time {}
452
+ d0string = "0000-00-00"
453
+ dt0string = "0000-00-00 00:00:00"
454
+ modes = map [string ]* testmode {
455
+ "text" : & testmode {"" , args ()},
456
+ "binary" : & testmode {" WHERE 1 = ?" , args (1 )},
457
+ }
458
+ timetests = map [string ][]* timetest {
459
+ "DATE" : {
460
+ {dstring , dstring , date , false },
461
+ {d0string , d0string , date0 , true },
462
+ {date , dstring , date , false },
463
+ {date0 , d0string , date0 , true },
464
+ },
465
+ "DATETIME" : {
466
+ {dtstring , dtstring , datetime , false },
467
+ {dt0string , dt0string , date0 , true },
468
+ {datetime , dtstring , datetime , false },
469
+ {date0 , dt0string , date0 , true },
470
+ },
471
+ }
472
+ setups = []* setup {
473
+ {"string" , "&parseTime=false" , func (
474
+ db * DBTest , rows * sql.Rows , test * timetest , sqltype , resulttype , mode string ) {
475
+ var sOut string
476
+ if err := rows .Scan (& sOut ); err != nil {
477
+ db .Errorf ("%s (%s %s): %v" ,
478
+ sqltype , resulttype , mode , err )
479
+ } else if test .sOut != sOut {
480
+ db .Errorf ("%s (%s %s): %s != %s" ,
481
+ sqltype , resulttype , mode ,
482
+ test .sOut , sOut )
483
+ }
484
+ }},
485
+ {"time.Time" , "&parseTime=true" , func (
486
+ db * DBTest , rows * sql.Rows , test * timetest , sqltype , resulttype , mode string ) {
487
+ var tOut time.Time
488
+ if err := rows .Scan (& tOut ); err != nil {
489
+ db .Errorf ("%s (%s %s): %v" ,
490
+ sqltype , resulttype , mode , err )
491
+ } else if test .tOut != tOut || test .tIsZero != tOut .IsZero () {
492
+ db .Errorf ("%s (%s %s): %s [%t] != %s [%t]" ,
493
+ sqltype , resulttype , mode ,
494
+ test .tOut , test .tIsZero ,
495
+ tOut , tOut .IsZero ())
496
+ }
497
+ }},
498
+ }
499
+ )
462
500
501
+ var s * setup
463
502
testTime := func (db * DBTest ) {
464
- defer db . mustExec ( "DROP TABLE IF EXISTS test" )
465
- for i , v := range types {
503
+ var rows * sql. Rows
504
+ for sqltype , tests := range timetests {
466
505
db .mustExec ("DROP TABLE IF EXISTS test" )
467
- db .mustExec ("CREATE TABLE test (value " + v + ") CHARACTER SET utf8 COLLATE utf8_unicode_ci" )
468
- for j := range tests [i ] {
469
- db .mustExec ("INSERT INTO test VALUES (?)" , tests [i ][j ].in )
470
- // string
471
- rows [0 ] = db .mustQuery ("SELECT value FROM test" ) // text
472
- rows [1 ] = db .mustQuery ("SELECT value FROM test WHERE 1 = ?" , 1 ) // binary
473
-
474
- for k := range rows {
475
- if rows [k ].Next () {
476
- if resultType == "string" {
477
- err = rows [k ].Scan (& sOut )
478
- if err != nil {
479
- db .Errorf ("%s (%s %s): %v" ,
480
- v , resultType , modes [k ], err )
481
- } else if tests [i ][j ].sOut != sOut {
482
- db .Errorf ("%s (%s %s): %s != %s" ,
483
- v , resultType , modes [k ],
484
- tests [i ][j ].sOut , sOut )
485
- }
486
- } else {
487
- err = rows [k ].Scan (& tOut )
488
- if err != nil {
489
- t .Errorf ("%s (%s %s): %v" ,
490
- v , resultType , modes [k ], err )
491
- } else if tests [i ][j ].tOut != tOut || tests [i ][j ].tIsZero != tOut .IsZero () {
492
- t .Errorf ("%s (%s %s): %s [%t] != %s [%t]" ,
493
- v , resultType , modes [k ],
494
- tests [i ][j ].tOut , tests [i ][j ].tIsZero ,
495
- tOut , tOut .IsZero ())
496
- }
497
- }
506
+ db .mustExec ("CREATE TABLE test (value " + sqltype + ") CHARACTER SET utf8 COLLATE utf8_unicode_ci" )
507
+ for _ , test := range tests {
508
+ db .mustExec ("INSERT INTO test VALUES (?)" , test .in )
509
+ for mode , q := range modes {
510
+ rows = db .mustQuery ("SELECT value FROM test" + q .selectSuffix , q .args ... )
511
+ if rows .Next () {
512
+ s .test (db , rows , test , sqltype , s .vartype , mode )
498
513
} else {
499
- err = rows [ k ] .Err ()
500
- if err != nil {
501
- db . Errorf ( "%s (%s %s): %v" , v , resultType , modes [ k ] , err )
514
+ if err : = rows .Err (); err != nil {
515
+ db . Errorf ( "%s (%s %s): %v" ,
516
+ sqltype , s . vartype , mode , err )
502
517
} else {
503
- db .Errorf ("%s (%s %s): no data" , v , resultType , modes [k ])
518
+ db .Errorf ("%s (%s %s): no data" ,
519
+ sqltype , s .vartype , mode )
504
520
}
505
521
}
506
522
}
507
523
}
508
524
}
509
525
}
510
526
511
- resultType = "string"
512
527
oldDsn := dsn
513
- dsn += "&sql_mode=ALLOW_INVALID_DATES"
514
- runTests (t , "TestDateTime" , testTime )
515
- dsn += "&parseTime=true"
516
- resultType = "time.Time"
517
- runTests (t , "TestDateTime" , testTime )
528
+ usedDsn := oldDsn + "&sql_mode=ALLOW_INVALID_DATES"
529
+ for _ , v := range setups {
530
+ s = v
531
+ dsn = usedDsn + s .dsnSuffix
532
+ runTests (t , "TestDateTime" , testTime )
533
+ }
518
534
dsn = oldDsn
519
535
}
520
536
@@ -634,8 +650,6 @@ func _null(db *DBTest) {
634
650
} else {
635
651
db .Error ("no data" )
636
652
}
637
-
638
- db .mustExec ("DROP TABLE IF EXISTS test" )
639
653
}
640
654
641
655
func TestLongData (t * testing.T ) {
@@ -655,7 +669,6 @@ func _longData(db *DBTest) {
655
669
maxAllowedPacketSize = 1 << 25
656
670
}
657
671
658
- db .mustExec ("DROP TABLE IF EXISTS test" )
659
672
db .mustExec ("CREATE TABLE test (value LONGBLOB) CHARACTER SET utf8 COLLATE utf8_unicode_ci" )
660
673
661
674
in := strings .Repeat (`0` , maxAllowedPacketSize + 1 )
@@ -696,8 +709,6 @@ func _longData(db *DBTest) {
696
709
} else {
697
710
db .Fatalf ("LONGBLOB: no data" )
698
711
}
699
-
700
- db .mustExec ("DROP TABLE IF EXISTS test" )
701
712
}
702
713
703
714
func TestLoadData (t * testing.T ) {
@@ -787,8 +798,6 @@ func _loadData(db *DBTest) {
787
798
} else if err .Error () != "Reader 'doesnotexist' is not registered" {
788
799
db .Fatal (err .Error ())
789
800
}
790
-
791
- db .mustExec ("DROP TABLE IF EXISTS test" )
792
801
}
793
802
794
803
// Special cases
0 commit comments