Commit b12b6197 authored by gwenn's avatar gwenn

Improve test coverage.

parent 757b392d
...@@ -152,7 +152,7 @@ func (r *BlobReader) Seek(offset int64, whence int) (int64, error) { ...@@ -152,7 +152,7 @@ func (r *BlobReader) Seek(offset int64, whence int) (int64, error) {
// (See http://sqlite.org/c3ref/blob_bytes.html) // (See http://sqlite.org/c3ref/blob_bytes.html)
func (r *BlobReader) Size() (int32, error) { func (r *BlobReader) Size() (int32, error) {
if r.bl == nil { if r.bl == nil {
return 0, errors.New("blob reader already closed") return 0, errors.New("blob already closed")
} }
if r.size < 0 { if r.size < 0 {
r.size = int32(C.sqlite3_blob_bytes(r.bl)) r.size = int32(C.sqlite3_blob_bytes(r.bl))
......
...@@ -37,6 +37,10 @@ func TestBlob(t *testing.T) { ...@@ -37,6 +37,10 @@ func TestBlob(t *testing.T) {
checkNoError(t, err, "blob write error: %s") checkNoError(t, err, "blob write error: %s")
//bw.Close() //bw.Close()
_, err = bw.Write([]byte("5678901"))
assert.T(t, err != nil)
//println(err.Error())
err = bw.Reopen(rowid) err = bw.Reopen(rowid)
checkNoError(t, err, "blob reopen error: %s") checkNoError(t, err, "blob reopen error: %s")
bw.Close() bw.Close()
...@@ -81,6 +85,18 @@ func TestBlob(t *testing.T) { ...@@ -81,6 +85,18 @@ func TestBlob(t *testing.T) {
_, err = br.Size() _, err = br.Size()
assert.T(t, err != nil) assert.T(t, err != nil)
_, err = br.Read(content)
assert.T(t, err != nil)
//println(err.Error())
err = bw.Reopen(-1)
assert.T(t, err != nil)
//println(err.Error())
_, err = bw.Write(content)
assert.T(t, err != nil)
//println(err.Error())
} }
func TestBlobMisuse(t *testing.T) { func TestBlobMisuse(t *testing.T) {
......
...@@ -75,7 +75,7 @@ func TestRegexpFunction(t *testing.T) { ...@@ -75,7 +75,7 @@ func TestRegexpFunction(t *testing.T) {
defer checkClose(db, t) defer checkClose(db, t)
err := db.CreateScalarFunction("regexp", 2, true, nil, re, reDestroy) err := db.CreateScalarFunction("regexp", 2, true, nil, re, reDestroy)
checkNoError(t, err, "couldn't create function: %s") checkNoError(t, err, "couldn't create function: %s")
s, err := db.Prepare("SELECT regexp('l.s[aeiouy]', name) from (SELECT 'lisa' AS name UNION ALL SELECT 'bart')") s, err := db.Prepare("SELECT regexp('l.s[aeiouy]', name) from (SELECT 'lisa' AS name UNION ALL SELECT 'bart' UNION ALL SELECT NULL)")
checkNoError(t, err, "couldn't prepare statement: %s") checkNoError(t, err, "couldn't prepare statement: %s")
defer checkFinalize(s, t) defer checkFinalize(s, t)
...@@ -94,6 +94,13 @@ func TestRegexpFunction(t *testing.T) { ...@@ -94,6 +94,13 @@ func TestRegexpFunction(t *testing.T) {
checkNoError(t, err, "couldn't scan result: %s") checkNoError(t, err, "couldn't scan result: %s")
assert.Equal(t, 0, i) assert.Equal(t, 0, i)
assert.T(t, reused, "unexpected reused state") assert.T(t, reused, "unexpected reused state")
if b := Must(s.Next()); !b {
t.Fatalf("No result")
}
i, _, err = s.ScanInt(0)
checkNoError(t, err, "couldn't scan result: %s")
assert.Equal(t, 0, i)
} }
func user(ctx *ScalarContext, nArg int) { func user(ctx *ScalarContext, nArg int) {
......
...@@ -26,7 +26,7 @@ func (c *Conn) Databases() (map[string]string, error) { ...@@ -26,7 +26,7 @@ func (c *Conn) Databases() (map[string]string, error) {
defer s.finalize() defer s.finalize()
var databases = make(map[string]string) var databases = make(map[string]string)
var name, file string var name, file string
err = s.Select(func(s *Stmt) (err error) { err = s.execQuery(func(s *Stmt) (err error) {
if err = s.Scan(nil, &name, &file); err != nil { if err = s.Scan(nil, &name, &file); err != nil {
return return
} }
...@@ -154,7 +154,7 @@ func (c *Conn) Columns(dbName, table string) ([]Column, error) { ...@@ -154,7 +154,7 @@ func (c *Conn) Columns(dbName, table string) ([]Column, error) {
} }
defer s.finalize() defer s.finalize()
var columns = make([]Column, 0, 20) var columns = make([]Column, 0, 20)
err = s.Select(func(s *Stmt) (err error) { err = s.execQuery(func(s *Stmt) (err error) {
c := Column{} c := Column{}
if err = s.Scan(&c.Cid, &c.Name, &c.DataType, &c.NotNull, &c.DfltValue, &c.Pk); err != nil { if err = s.Scan(&c.Cid, &c.Name, &c.DataType, &c.NotNull, &c.DfltValue, &c.Pk); err != nil {
return return
...@@ -296,7 +296,7 @@ func (c *Conn) ForeignKeys(dbName, table string) (map[int]*ForeignKey, error) { ...@@ -296,7 +296,7 @@ func (c *Conn) ForeignKeys(dbName, table string) (map[int]*ForeignKey, error) {
var fks = make(map[int]*ForeignKey) var fks = make(map[int]*ForeignKey)
var id, seq int var id, seq int
var ref, from, to string var ref, from, to string
err = s.Select(func(s *Stmt) (err error) { err = s.execQuery(func(s *Stmt) (err error) {
if err = s.NamedScan("id", &id, "seq", &seq, "table", &ref, "from", &from, "to", &to); err != nil { if err = s.NamedScan("id", &id, "seq", &seq, "table", &ref, "from", &from, "to", &to); err != nil {
return return
} }
...@@ -338,7 +338,7 @@ func (c *Conn) TableIndexes(dbName, table string) ([]Index, error) { ...@@ -338,7 +338,7 @@ func (c *Conn) TableIndexes(dbName, table string) ([]Index, error) {
} }
defer s.finalize() defer s.finalize()
var indexes = make([]Index, 0, 5) var indexes = make([]Index, 0, 5)
err = s.Select(func(s *Stmt) (err error) { err = s.execQuery(func(s *Stmt) (err error) {
i := Index{} i := Index{}
if err = s.Scan(nil, &i.Name, &i.Unique); err != nil { if err = s.Scan(nil, &i.Name, &i.Unique); err != nil {
return return
...@@ -368,7 +368,7 @@ func (c *Conn) IndexColumns(dbName, index string) ([]Column, error) { ...@@ -368,7 +368,7 @@ func (c *Conn) IndexColumns(dbName, index string) ([]Column, error) {
} }
defer s.finalize() defer s.finalize()
var columns = make([]Column, 0, 5) var columns = make([]Column, 0, 5)
err = s.Select(func(s *Stmt) (err error) { err = s.execQuery(func(s *Stmt) (err error) {
c := Column{} c := Column{}
if err = s.Scan(nil, &c.Cid, &c.Name); err != nil { if err = s.Scan(nil, &c.Cid, &c.Name); err != nil {
return return
......
...@@ -114,12 +114,12 @@ func TestColumns(t *testing.T) { ...@@ -114,12 +114,12 @@ func TestColumns(t *testing.T) {
columns, err = db.Columns("main", "test") columns, err = db.Columns("main", "test")
checkNoError(t, err, "error listing columns: %s") checkNoError(t, err, "error listing columns: %s")
columns, err = db.Columns("bim", "test") _, err = db.Columns("bim", "test")
assert.T(t, err != nil, "expected error") assert.T(t, err != nil, "expected error")
//println(err.Error()) //println(err.Error())
columns, err = db.Columns("", "bim") _, err = db.Columns("", "bim")
assert.T(t, err != nil, "expected error") //assert.T(t, err != nil, "expected error")
//println(err.Error()) //println(err.Error())
} }
...@@ -168,7 +168,7 @@ func TestForeignKeys(t *testing.T) { ...@@ -168,7 +168,7 @@ func TestForeignKeys(t *testing.T) {
//println(err.Error()) //println(err.Error())
_, err = db.ForeignKeys("", "bim") _, err = db.ForeignKeys("", "bim")
assert.T(t, err != nil) //assert.T(t, err != nil)
//println(err.Error()) //println(err.Error())
} }
......
...@@ -170,7 +170,7 @@ func (c *Conn) ForeignKeyCheck(dbName, table string) ([]FkViolation, error) { ...@@ -170,7 +170,7 @@ func (c *Conn) ForeignKeyCheck(dbName, table string) ([]FkViolation, error) {
defer s.finalize() defer s.finalize()
// table|rowid|parent|fkid // table|rowid|parent|fkid
var violations = make([]FkViolation, 0, 20) var violations = make([]FkViolation, 0, 20)
err = s.Select(func(s *Stmt) (err error) { err = s.execQuery(func(s *Stmt) (err error) {
v := FkViolation{} v := FkViolation{}
if err = s.Scan(&v.Table, &v.RowId, &v.Parent, &v.FkId); err != nil { if err = s.Scan(&v.Table, &v.RowId, &v.Parent, &v.FkId); err != nil {
return return
...@@ -244,3 +244,22 @@ func (c *Conn) oneValue(query string, value interface{}) error { // no cache ...@@ -244,3 +244,22 @@ func (c *Conn) oneValue(query string, value interface{}) error { // no cache
} }
return s.error(rv, fmt.Sprintf("Conn.oneValue(%q)", query)) return s.error(rv, fmt.Sprintf("Conn.oneValue(%q)", query))
} }
func (s *Stmt) execQuery(rowCallbackHandler func(s *Stmt) error, args ...interface{}) error { // no check on column count
if len(args) > 0 {
err := s.Bind(args...)
if err != nil {
return err
}
}
for {
if ok, err := s.Next(); err != nil {
return err
} else if !ok {
break
}
if err := rowCallbackHandler(s); err != nil {
return err
}
}
return nil
}
...@@ -70,6 +70,10 @@ func TestLockingMode(t *testing.T) { ...@@ -70,6 +70,10 @@ func TestLockingMode(t *testing.T) {
mode, err := db.LockingMode("") mode, err := db.LockingMode("")
checkNoError(t, err, "Error reading locking-mode of database: %s") checkNoError(t, err, "Error reading locking-mode of database: %s")
assert.Equal(t, "normal", mode) assert.Equal(t, "normal", mode)
_, err = db.LockingMode("bim")
assert.T(t, err != nil)
//println(err.Error())
} }
func TestSetLockingMode(t *testing.T) { func TestSetLockingMode(t *testing.T) {
......
...@@ -23,6 +23,13 @@ func checkNoError(t *testing.T, err error, format string) { ...@@ -23,6 +23,13 @@ func checkNoError(t *testing.T, err error, format string) {
} }
} }
func Must(b bool, err error) bool {
if err != nil {
panic(err)
}
return b
}
func open(t *testing.T) *Conn { func open(t *testing.T) *Conn {
db, err := Open(":memory:", OpenReadWrite, OpenCreate, OpenFullMutex /*OpenNoMutex*/) db, err := Open(":memory:", OpenReadWrite, OpenCreate, OpenFullMutex /*OpenNoMutex*/)
checkNoError(t, err, "couldn't open database file: %s") checkNoError(t, err, "couldn't open database file: %s")
......
...@@ -437,10 +437,6 @@ func (s *Stmt) BindReflect(index int, value interface{}) error { ...@@ -437,10 +437,6 @@ func (s *Stmt) BindReflect(index int, value interface{}) error {
// } // }
// err = s.Scan(&fnum, &inum, &sstr) // err = s.Scan(&fnum, &inum, &sstr)
// } // }
// With panic on error:
// for Must(s.Next()) {
// err := s.Scan(&fnum, &inum, &sstr)
// }
// //
// (See http://sqlite.org/c3ref/step.html) // (See http://sqlite.org/c3ref/step.html)
func (s *Stmt) Next() (bool, error) { func (s *Stmt) Next() (bool, error) {
......
...@@ -683,6 +683,16 @@ func TestBindAndScanReflect(t *testing.T) { ...@@ -683,6 +683,16 @@ func TestBindAndScanReflect(t *testing.T) {
_, err = is.ScanReflect(0, &enum) _, err = is.ScanReflect(0, &enum)
assert.T(t, err != nil) assert.T(t, err != nil)
//println(err.Error()) //println(err.Error())
var ut error
_, err = is.ScanReflect(0, &ut)
assert.T(t, err != nil)
//println(err.Error())
var ui uint64 = math.MaxUint64
err = is.BindReflect(1, ui)
assert.T(t, err != nil)
//println(err.Error())
} }
func TestSelect(t *testing.T) { func TestSelect(t *testing.T) {
......
...@@ -448,7 +448,7 @@ func (s *Stmt) ExplainQueryPlan(w io.Writer) error { ...@@ -448,7 +448,7 @@ func (s *Stmt) ExplainQueryPlan(w io.Writer) error {
var selectid, order, from int var selectid, order, from int
var detail string var detail string
err = sExplain.Select(func(s *Stmt) error { err = sExplain.execQuery(func(s *Stmt) error {
if err := s.Scan(&selectid, &order, &from, &detail); err != nil { if err := s.Scan(&selectid, &order, &from, &detail); err != nil {
return err return err
} }
......
...@@ -54,15 +54,6 @@ func Mprintf2(format string, arg1, arg2 string) string { ...@@ -54,15 +54,6 @@ func Mprintf2(format string, arg1, arg2 string) string {
return C.GoString(zSQL) return C.GoString(zSQL)
} }
// Must is a helper that wraps a call to a function returning (bool, os.Error)
// and panics if the error is non-nil.
func Must(b bool, err error) bool {
if err != nil {
panic(err)
}
return b
}
func btocint(b bool) C.int { func btocint(b bool) C.int {
if b { if b {
return 1 return 1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment