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) {
// (See http://sqlite.org/c3ref/blob_bytes.html)
func (r *BlobReader) Size() (int32, error) {
if r.bl == nil {
return 0, errors.New("blob reader already closed")
return 0, errors.New("blob already closed")
}
if r.size < 0 {
r.size = int32(C.sqlite3_blob_bytes(r.bl))
......
......@@ -37,6 +37,10 @@ func TestBlob(t *testing.T) {
checkNoError(t, err, "blob write error: %s")
//bw.Close()
_, err = bw.Write([]byte("5678901"))
assert.T(t, err != nil)
//println(err.Error())
err = bw.Reopen(rowid)
checkNoError(t, err, "blob reopen error: %s")
bw.Close()
......@@ -81,6 +85,18 @@ func TestBlob(t *testing.T) {
_, err = br.Size()
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) {
......
......@@ -75,7 +75,7 @@ func TestRegexpFunction(t *testing.T) {
defer checkClose(db, t)
err := db.CreateScalarFunction("regexp", 2, true, nil, re, reDestroy)
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")
defer checkFinalize(s, t)
......@@ -94,6 +94,13 @@ func TestRegexpFunction(t *testing.T) {
checkNoError(t, err, "couldn't scan result: %s")
assert.Equal(t, 0, i)
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) {
......
......@@ -26,7 +26,7 @@ func (c *Conn) Databases() (map[string]string, error) {
defer s.finalize()
var databases = make(map[string]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 {
return
}
......@@ -154,7 +154,7 @@ func (c *Conn) Columns(dbName, table string) ([]Column, error) {
}
defer s.finalize()
var columns = make([]Column, 0, 20)
err = s.Select(func(s *Stmt) (err error) {
err = s.execQuery(func(s *Stmt) (err error) {
c := Column{}
if err = s.Scan(&c.Cid, &c.Name, &c.DataType, &c.NotNull, &c.DfltValue, &c.Pk); err != nil {
return
......@@ -296,7 +296,7 @@ func (c *Conn) ForeignKeys(dbName, table string) (map[int]*ForeignKey, error) {
var fks = make(map[int]*ForeignKey)
var id, seq int
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 {
return
}
......@@ -338,7 +338,7 @@ func (c *Conn) TableIndexes(dbName, table string) ([]Index, error) {
}
defer s.finalize()
var indexes = make([]Index, 0, 5)
err = s.Select(func(s *Stmt) (err error) {
err = s.execQuery(func(s *Stmt) (err error) {
i := Index{}
if err = s.Scan(nil, &i.Name, &i.Unique); err != nil {
return
......@@ -368,7 +368,7 @@ func (c *Conn) IndexColumns(dbName, index string) ([]Column, error) {
}
defer s.finalize()
var columns = make([]Column, 0, 5)
err = s.Select(func(s *Stmt) (err error) {
err = s.execQuery(func(s *Stmt) (err error) {
c := Column{}
if err = s.Scan(nil, &c.Cid, &c.Name); err != nil {
return
......
......@@ -114,12 +114,12 @@ func TestColumns(t *testing.T) {
columns, err = db.Columns("main", "test")
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")
//println(err.Error())
columns, err = db.Columns("", "bim")
assert.T(t, err != nil, "expected error")
_, err = db.Columns("", "bim")
//assert.T(t, err != nil, "expected error")
//println(err.Error())
}
......@@ -168,7 +168,7 @@ func TestForeignKeys(t *testing.T) {
//println(err.Error())
_, err = db.ForeignKeys("", "bim")
assert.T(t, err != nil)
//assert.T(t, err != nil)
//println(err.Error())
}
......
......@@ -170,7 +170,7 @@ func (c *Conn) ForeignKeyCheck(dbName, table string) ([]FkViolation, error) {
defer s.finalize()
// table|rowid|parent|fkid
var violations = make([]FkViolation, 0, 20)
err = s.Select(func(s *Stmt) (err error) {
err = s.execQuery(func(s *Stmt) (err error) {
v := FkViolation{}
if err = s.Scan(&v.Table, &v.RowId, &v.Parent, &v.FkId); err != nil {
return
......@@ -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))
}
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) {
mode, err := db.LockingMode("")
checkNoError(t, err, "Error reading locking-mode of database: %s")
assert.Equal(t, "normal", mode)
_, err = db.LockingMode("bim")
assert.T(t, err != nil)
//println(err.Error())
}
func TestSetLockingMode(t *testing.T) {
......
......@@ -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 {
db, err := Open(":memory:", OpenReadWrite, OpenCreate, OpenFullMutex /*OpenNoMutex*/)
checkNoError(t, err, "couldn't open database file: %s")
......
......@@ -437,10 +437,6 @@ func (s *Stmt) BindReflect(index int, value interface{}) error {
// }
// 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)
func (s *Stmt) Next() (bool, error) {
......
......@@ -683,6 +683,16 @@ func TestBindAndScanReflect(t *testing.T) {
_, err = is.ScanReflect(0, &enum)
assert.T(t, err != nil)
//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) {
......
......@@ -448,7 +448,7 @@ func (s *Stmt) ExplainQueryPlan(w io.Writer) error {
var selectid, order, from int
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 {
return err
}
......
......@@ -54,15 +54,6 @@ func Mprintf2(format string, arg1, arg2 string) string {
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 {
if b {
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