1616#include < gtest/gtest.h>
1717
1818#include < cstdio>
19+ #include < cstdint>
1920
2021
2122TEST (Column, basics) {
@@ -27,31 +28,109 @@ TEST(Column, basics) {
2728 EXPECT_EQ (SQLITE_OK, db.getExtendedErrorCode ());
2829
2930 // Create a new table
30- EXPECT_EQ (0 , db.exec (" CREATE TABLE test (id INTEGER PRIMARY KEY, msg TEXT, int INTEGER, double REAL)" ));
31+ EXPECT_EQ (0 , db.exec (" CREATE TABLE test (id INTEGER PRIMARY KEY, msg TEXT, int INTEGER, double REAL, binary BLOB, empty TEXT )" ));
3132 EXPECT_TRUE (db.tableExists (" test" ));
3233 EXPECT_TRUE (db.tableExists (std::string (" test" )));
3334 EXPECT_EQ (0 , db.getLastInsertRowid ());
3435
35- // Create a first row
36- EXPECT_EQ (1 , db.exec (" INSERT INTO test VALUES (NULL, \" first\" , 123, 0.123)" ));
36+ // Create a first row (autoid: 1) with all kind of data and a null value
37+ SQLite::Statement insert (db, " INSERT INTO test VALUES (NULL, \" first\" , 123, 0.123, ?, NULL)" );
38+ // Bind the blob value to the first parameter of the SQL query
39+ char buffer[] = " blob" ;
40+ void * blob = &buffer;
41+ int size = sizeof (buffer);
42+ insert.bind (1 , blob, size);
43+ // Execute the one-step query to insert the row
44+ EXPECT_EQ (1 , insert.exec ());
45+
3746 EXPECT_EQ (1 , db.getLastInsertRowid ());
3847 EXPECT_EQ (1 , db.getTotalChanges ());
3948
4049 // Compile a SQL query
4150 SQLite::Statement query (db, " SELECT * FROM test" );
4251 EXPECT_STREQ (" SELECT * FROM test" , query.getQuery ().c_str ());
43- EXPECT_EQ (4 , query.getColumnCount ());
52+ EXPECT_EQ (6 , query.getColumnCount ());
4453 query.executeStep ();
4554 EXPECT_TRUE (query.isOk ());
4655 EXPECT_FALSE (query.isDone ());
4756
48- // TODO
49- const std::string msg = query.getColumn (" msg" );
50- const int integer = query.getColumn (" int" );
51- const double real = query.getColumn (" double" );
52- EXPECT_EQ (" first" , msg);
53- EXPECT_EQ (123 , integer);
54- EXPECT_EQ (0.123 , real);
57+ // validates every variant of cast operators, and conversions of types
58+ {
59+ int64_t id = query.getColumn (0 ); // operator sqlite3_int64()
60+ const char * ptxt = query.getColumn (1 ); // operator const char*()
61+ const std::string msg = query.getColumn (1 ); // operator std::string() (or const char* with MSVC)
62+ const int integer = query.getColumn (2 ); // operator int()
63+ const double real = query.getColumn (3 ); // operator double()
64+ const void * pblob = query.getColumn (4 ); // operator void*()
65+ const void * pempty = query.getColumn (5 ); // operator void*()
66+ EXPECT_EQ (1 , id);
67+ EXPECT_STREQ (" first" , ptxt);
68+ EXPECT_EQ (" first" , msg);
69+ EXPECT_EQ (123 , integer);
70+ EXPECT_EQ (0.123 , real);
71+ EXPECT_EQ (0 , memcmp (" blob" , pblob, size));
72+ EXPECT_EQ (NULL , pempty);
73+ }
74+
75+ // validates every variant of explicit getters
76+ {
77+ int64_t id = query.getColumn (0 ).getInt64 ();
78+ const char * ptxt = query.getColumn (1 ).getText ();
79+ const std::string msg = query.getColumn (1 ).getText ();
80+ const int integer = query.getColumn (2 ).getInt ();
81+ const double real = query.getColumn (3 ).getDouble ();
82+ const void * pblob = query.getColumn (1 ).getBlob ();
83+ EXPECT_EQ (1 , id);
84+ EXPECT_STREQ (" first" , ptxt);
85+ EXPECT_EQ (" first" , msg);
86+ EXPECT_EQ (123 , integer);
87+ EXPECT_EQ (0.123 , real);
88+ EXPECT_EQ (0 , memcmp (" first" , pblob, 5 ));
89+ }
90+
91+ // Validate getBytes(), getType(), isInteger(), isNull()...
92+ EXPECT_EQ (SQLITE_INTEGER, query.getColumn (0 ).getType ());
93+ EXPECT_EQ (true , query.getColumn (0 ).isInteger ());
94+ EXPECT_EQ (false , query.getColumn (0 ).isFloat ());
95+ EXPECT_EQ (false , query.getColumn (0 ).isText ());
96+ EXPECT_EQ (false , query.getColumn (0 ).isBlob ());
97+ EXPECT_EQ (false , query.getColumn (0 ).isNull ());
98+ EXPECT_EQ (1 , query.getColumn (0 ).getBytes ()); // size of the string "1" without the null terminator
99+ EXPECT_EQ (SQLITE_TEXT, query.getColumn (1 ).getType ());
100+ EXPECT_EQ (false , query.getColumn (1 ).isInteger ());
101+ EXPECT_EQ (false , query.getColumn (1 ).isFloat ());
102+ EXPECT_EQ (true , query.getColumn (1 ).isText ());
103+ EXPECT_EQ (false , query.getColumn (1 ).isBlob ());
104+ EXPECT_EQ (false , query.getColumn (1 ).isNull ());
105+ EXPECT_EQ (5 , query.getColumn (1 ).getBytes ()); // size of the string "first"
106+ EXPECT_EQ (SQLITE_INTEGER, query.getColumn (2 ).getType ());
107+ EXPECT_EQ (true , query.getColumn (2 ).isInteger ());
108+ EXPECT_EQ (false , query.getColumn (2 ).isFloat ());
109+ EXPECT_EQ (false , query.getColumn (2 ).isText ());
110+ EXPECT_EQ (false , query.getColumn (2 ).isBlob ());
111+ EXPECT_EQ (false , query.getColumn (2 ).isNull ());
112+ EXPECT_EQ (3 , query.getColumn (2 ).getBytes ()); // size of the string "123"
113+ EXPECT_EQ (SQLITE_FLOAT, query.getColumn (3 ).getType ());
114+ EXPECT_EQ (false , query.getColumn (3 ).isInteger ());
115+ EXPECT_EQ (true , query.getColumn (3 ).isFloat ());
116+ EXPECT_EQ (false , query.getColumn (3 ).isText ());
117+ EXPECT_EQ (false , query.getColumn (3 ).isBlob ());
118+ EXPECT_EQ (false , query.getColumn (3 ).isNull ());
119+ EXPECT_EQ (5 , query.getColumn (3 ).getBytes ()); // size of the string "0.123"
120+ EXPECT_EQ (5 , query.getColumn (4 ).getBytes ()); // size of the string "blob" with the null terminator
121+ EXPECT_EQ (SQLITE_BLOB, query.getColumn (4 ).getType ());
122+ EXPECT_EQ (false , query.getColumn (4 ).isInteger ());
123+ EXPECT_EQ (false , query.getColumn (4 ).isFloat ());
124+ EXPECT_EQ (false , query.getColumn (4 ).isText ());
125+ EXPECT_EQ (true , query.getColumn (4 ).isBlob ());
126+ EXPECT_EQ (false , query.getColumn (4 ).isNull ());
127+ EXPECT_EQ (0 , query.getColumn (5 ).getBytes ()); // size of the string "" without the null terminator
128+ EXPECT_EQ (SQLITE_NULL, query.getColumn (5 ).getType ());
129+ EXPECT_EQ (false , query.getColumn (5 ).isInteger ());
130+ EXPECT_EQ (false , query.getColumn (5 ).isFloat ());
131+ EXPECT_EQ (false , query.getColumn (5 ).isText ());
132+ EXPECT_EQ (false , query.getColumn (5 ).isBlob ());
133+ EXPECT_EQ (true , query.getColumn (5 ).isNull ());
55134
56135 } // Close DB test.db3
57136 remove (" test.db3" );
0 commit comments