@@ -119,9 +119,11 @@ func runTests(t *testing.T, name string, tests ...func(db *DBTest)) {
119119 defer db .Close ()
120120
121121 environment := & DBTest {t , db }
122+ environment .mustExec ("DROP TABLE IF EXISTS test" )
122123 for _ , test := range tests {
123124 test (environment )
124125 }
126+ environment .mustExec ("DROP TABLE IF EXISTS test" )
125127}
126128
127129func args (args ... interface {}) []interface {} {
@@ -206,8 +208,6 @@ func _rawBytesResultExceedsBuffer(db *DBTest) {
206208}
207209
208210func _crud (db * DBTest ) {
209- db .mustExec ("DROP TABLE IF EXISTS test" )
210-
211211 // Create Table
212212 db .mustExec ("CREATE TABLE test (value BOOL)" )
213213
@@ -302,8 +302,6 @@ func TestInt(t *testing.T) {
302302}
303303
304304func _int (db * DBTest ) {
305- db .mustExec ("DROP TABLE IF EXISTS test" )
306-
307305 types := [5 ]string {"TINYINT" , "SMALLINT" , "MEDIUMINT" , "INT" , "BIGINT" }
308306 in := int64 (42 )
309307 var out int64
@@ -353,8 +351,6 @@ func TestFloat(t *testing.T) {
353351}
354352
355353func _float (db * DBTest ) {
356- db .mustExec ("DROP TABLE IF EXISTS test" )
357-
358354 types := [2 ]string {"FLOAT" , "DOUBLE" }
359355 in := float32 (42.23 )
360356 var out float32
@@ -384,8 +380,6 @@ func TestString(t *testing.T) {
384380}
385381
386382func _string (db * DBTest ) {
387- db .mustExec ("DROP TABLE IF EXISTS test" )
388-
389383 types := [6 ]string {"CHAR(255)" , "VARCHAR(255)" , "TINYTEXT" , "TEXT" , "MEDIUMTEXT" , "LONGTEXT" }
390384 in := "κόσμε üöäßñóùéàâÿœ'îë Árvíztűrő いろはにほへとちりぬるを イロハニホヘト דג סקרן чащах น่าฟังเอย"
391385 var out string
@@ -432,89 +426,111 @@ func _string(db *DBTest) {
432426}
433427
434428func 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 {
438434 in interface {}
439435 sOut string
440436 tOut time.Time
441437 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+ )
462500
501+ var s * setup
463502 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 {
466505 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 )
498513 } 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 )
502517 } 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 )
504520 }
505521 }
506522 }
507523 }
508524 }
509525 }
510526
511- resultType = "string"
512527 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+ }
518534 dsn = oldDsn
519535}
520536
@@ -634,8 +650,6 @@ func _null(db *DBTest) {
634650 } else {
635651 db .Error ("no data" )
636652 }
637-
638- db .mustExec ("DROP TABLE IF EXISTS test" )
639653}
640654
641655func TestLongData (t * testing.T ) {
@@ -655,7 +669,6 @@ func _longData(db *DBTest) {
655669 maxAllowedPacketSize = 1 << 25
656670 }
657671
658- db .mustExec ("DROP TABLE IF EXISTS test" )
659672 db .mustExec ("CREATE TABLE test (value LONGBLOB) CHARACTER SET utf8 COLLATE utf8_unicode_ci" )
660673
661674 in := strings .Repeat (`0` , maxAllowedPacketSize + 1 )
@@ -696,8 +709,6 @@ func _longData(db *DBTest) {
696709 } else {
697710 db .Fatalf ("LONGBLOB: no data" )
698711 }
699-
700- db .mustExec ("DROP TABLE IF EXISTS test" )
701712}
702713
703714func TestLoadData (t * testing.T ) {
@@ -787,8 +798,6 @@ func _loadData(db *DBTest) {
787798 } else if err .Error () != "Reader 'doesnotexist' is not registered" {
788799 db .Fatal (err .Error ())
789800 }
790-
791- db .mustExec ("DROP TABLE IF EXISTS test" )
792801}
793802
794803// Special cases
0 commit comments