aboutsummaryrefslogtreecommitdiff
path: root/all_test.go
diff options
context:
space:
mode:
authorJan Mercl <0xjnml@gmail.com>2017-04-21 01:17:29 +0200
committerJan Mercl <0xjnml@gmail.com>2017-04-21 01:17:29 +0200
commited3807ab478f18e3be176f504c811a7b4b7d9b8e (patch)
tree5740e4e0fa8585cd8367bc0f3562fe7caf133344 /all_test.go
Add Initial content.
Diffstat (limited to 'all_test.go')
-rw-r--r--all_test.go190
1 files changed, 190 insertions, 0 deletions
diff --git a/all_test.go b/all_test.go
new file mode 100644
index 0000000..27461e8
--- /dev/null
+++ b/all_test.go
@@ -0,0 +1,190 @@
+// Copyright 2017 The Sqlite Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package sqlite
+
+import (
+ "bytes"
+ "database/sql"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "testing"
+ "time"
+)
+
+func caller(s string, va ...interface{}) {
+ if s == "" {
+ s = strings.Repeat("%v ", len(va))
+ }
+ _, fn, fl, _ := runtime.Caller(2)
+ fmt.Fprintf(os.Stderr, "# caller: %s:%d: ", path.Base(fn), fl)
+ fmt.Fprintf(os.Stderr, s, va...)
+ fmt.Fprintln(os.Stderr)
+ _, fn, fl, _ = runtime.Caller(1)
+ fmt.Fprintf(os.Stderr, "# \tcallee: %s:%d: ", path.Base(fn), fl)
+ fmt.Fprintln(os.Stderr)
+ os.Stderr.Sync()
+}
+
+func dbg(s string, va ...interface{}) {
+ if s == "" {
+ s = strings.Repeat("%v ", len(va))
+ }
+ _, fn, fl, _ := runtime.Caller(1)
+ fmt.Fprintf(os.Stderr, "# dbg %s:%d: ", path.Base(fn), fl)
+ fmt.Fprintf(os.Stderr, s, va...)
+ fmt.Fprintln(os.Stderr)
+ os.Stderr.Sync()
+}
+
+func TODO(...interface{}) string { //TODOOK
+ _, fn, fl, _ := runtime.Caller(1)
+ return fmt.Sprintf("# TODO: %s:%d:\n", path.Base(fn), fl) //TODOOK
+}
+
+func use(...interface{}) {}
+
+func init() {
+ use(caller, dbg, TODO) //TODOOK
+}
+
+// ============================================================================
+
+func tempDB(t *testing.T) (string, *sql.DB) {
+ dir, err := ioutil.TempDir("", "sqlite-test-")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ db, err := sql.Open(driverName, filepath.Join(dir, "tmp.db"))
+ if err != nil {
+ os.RemoveAll(dir)
+ t.Fatal(err)
+ }
+
+ return dir, db
+}
+
+func TestScalar(t *testing.T) {
+ dir, db := tempDB(t)
+ defer func() {
+ db.Close()
+ os.RemoveAll(dir)
+ }()
+
+ t1 := time.Date(2017, 4, 20, 1, 2, 3, 56789, time.UTC)
+ t2 := time.Date(2018, 5, 21, 2, 3, 4, 98765, time.UTC)
+ r, err := db.Exec(`
+ create table t(i int, f double, b bool, s text, t time);
+ insert into t values(12, 3.14, ?, "foo", ?), (34, 2.78, ?, "bar", ?);
+ `,
+ true, t1,
+ false, t2,
+ )
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ n, err := r.RowsAffected()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if g, e := n, int64(2); g != e {
+ t.Fatal(g, e)
+ }
+
+ rows, err := db.Query("select * from t")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ type rec struct {
+ i int
+ f float64
+ b bool
+ s string
+ t string
+ }
+ var a []rec
+ for rows.Next() {
+ var r rec
+ if err := rows.Scan(&r.i, &r.f, &r.b, &r.s, &r.t); err != nil {
+ t.Fatal(err)
+ }
+
+ a = append(a, r)
+ }
+ if err := rows.Err(); err != nil {
+ t.Fatal(err)
+ }
+
+ if g, e := len(a), 2; g != e {
+ t.Fatal(g, e)
+ }
+
+ if g, e := a[0], (rec{12, 3.14, true, "foo", t1.String()}); g != e {
+ t.Fatal(g, e)
+ }
+
+ if g, e := a[1], (rec{34, 2.78, false, "bar", t2.String()}); g != e {
+ t.Fatal(g, e)
+ }
+}
+
+func TestBlob(t *testing.T) {
+ dir, db := tempDB(t)
+ defer func() {
+ db.Close()
+ os.RemoveAll(dir)
+ }()
+
+ b1 := []byte(time.Now().String())
+ b2 := []byte("\x00foo\x00bar\x00")
+ if _, err := db.Exec(`
+ create table t(b blob);
+ insert into t values(?), (?);
+ `, b1, b2,
+ ); err != nil {
+ t.Fatal(err)
+ }
+
+ rows, err := db.Query("select * from t")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ type rec struct {
+ b []byte
+ }
+ var a []rec
+ for rows.Next() {
+ var r rec
+ if err := rows.Scan(&r.b); err != nil {
+ t.Fatal(err)
+ }
+
+ a = append(a, r)
+ }
+ if err := rows.Err(); err != nil {
+ t.Fatal(err)
+ }
+
+ if g, e := len(a), 2; g != e {
+ t.Fatal(g, e)
+ }
+
+ if g, e := a[0].b, b1; !bytes.Equal(g, e) {
+ t.Fatal(g, e)
+ }
+
+ if g, e := a[1].b, b2; !bytes.Equal(g, e) {
+ t.Fatal(g, e)
+ }
+}