|
9 | 9 | "os"
|
10 | 10 | "strings"
|
11 | 11 | "testing"
|
| 12 | + "time" |
12 | 13 | )
|
13 | 14 |
|
14 | 15 | var (
|
@@ -431,34 +432,89 @@ func _string(db *DBTest) {
|
431 | 432 | }
|
432 | 433 |
|
433 | 434 | func TestDateTime(t *testing.T) {
|
434 |
| - runTests(t, "TestDateTime", _dateTime) |
435 |
| -} |
436 |
| - |
437 |
| -func _dateTime(db *DBTest) { |
438 |
| - db.mustExec("DROP TABLE IF EXISTS test") |
439 |
| - |
440 |
| - types := [...]string{"DATE", "DATETIME"} |
441 |
| - in := [...]string{"2012-06-14", "2011-11-20 21:27:37"} |
442 |
| - var out string |
443 |
| - var rows *sql.Rows |
444 |
| - |
445 |
| - for i, v := range types { |
446 |
| - db.mustExec("CREATE TABLE test (value " + v + ") CHARACTER SET utf8 COLLATE utf8_unicode_ci") |
447 |
| - |
448 |
| - db.mustExec("INSERT INTO test VALUES (?)", in[i]) |
449 |
| - |
450 |
| - rows = db.mustQuery("SELECT value FROM test") |
451 |
| - if rows.Next() { |
452 |
| - rows.Scan(&out) |
453 |
| - if in[i] != out { |
454 |
| - db.Errorf("%s: %s != %s", v, in[i], out) |
| 435 | + var modes = [2]string{"text", "binary"} |
| 436 | + var types = [2]string{"DATE", "DATETIME"} |
| 437 | + var tests = [2][]struct { |
| 438 | + in interface{} |
| 439 | + sOut string |
| 440 | + tOut time.Time |
| 441 | + 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 |
| 462 | + |
| 463 | + testTime := func(db *DBTest) { |
| 464 | + defer db.mustExec("DROP TABLE IF EXISTS test") |
| 465 | + for i, v := range types { |
| 466 | + 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 | + } |
| 498 | + } else { |
| 499 | + err = rows[k].Err() |
| 500 | + if err != nil { |
| 501 | + db.Errorf("%s (%s %s): %v", v, resultType, modes[k], err) |
| 502 | + } else { |
| 503 | + db.Errorf("%s (%s %s): no data", v, resultType, modes[k]) |
| 504 | + } |
| 505 | + } |
| 506 | + } |
455 | 507 | }
|
456 |
| - } else { |
457 |
| - db.Errorf("%s: no data", v) |
458 | 508 | }
|
459 |
| - |
460 |
| - db.mustExec("DROP TABLE IF EXISTS test") |
461 | 509 | }
|
| 510 | + |
| 511 | + resultType = "string" |
| 512 | + runTests(t, "TestDateTime", testTime) |
| 513 | + oldDsn := dsn |
| 514 | + dsn = dsn + "&parseTime=true" |
| 515 | + resultType = "time.Time" |
| 516 | + runTests(t, "TestDateTime", testTime) |
| 517 | + dsn = oldDsn |
462 | 518 | }
|
463 | 519 |
|
464 | 520 | func TestNULL(t *testing.T) {
|
|
0 commit comments