Skip to content

Commit 8147c06

Browse files
committed
Add unittest about sql
Signed-off-by: Kunlin Yu <yukunlin@syriusrobotics.com>
1 parent 97b188a commit 8147c06

File tree

2 files changed

+205
-17
lines changed

2 files changed

+205
-17
lines changed

CMakeLists.txt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,6 @@ if (NOT GFlags_FOUND AND NOT gflags_FOUND)
1717
message(FATAL_ERROR "can not find gflags")
1818
endif()
1919

20-
# find_package(SQLite3 REQUIRED)
21-
find_package(libspatialite REQUIRED)
22-
find_package(SQLiteCpp REQUIRED)
23-
2420
include_directories(${CMAKE_SOURCE_DIR}/include)
2521
include_directories(${CMAKE_BINARY_DIR})
2622

@@ -81,5 +77,5 @@ target_link_libraries(test_bbox_reader GTest::GTest GTest::Main glog::glog GEOS:
8177
add_test(NAME test_bbox_reader COMMAND test_bbox_reader WORKING_DIRECTORY ${TEST_DIR})
8278

8379
add_executable(test_sql ${TEST_DIR}/test_sql.cc)
84-
target_link_libraries(test_sql GTest::GTest GTest::Main glog::glog SQLite::SQLite3 libspatialite::libspatialite SQLiteCpp)
80+
target_link_libraries(test_sql cql2cpp GTest::GTest GTest::Main glog::glog sqlite3 spatialite)
8581
add_test(NAME test_sql COMMAND test_sql WORKING_DIRECTORY ${TEST_DIR})

test/test_sql.cc

Lines changed: 204 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,215 @@
77
* Create Date: 2025/05/08
88
*
99
*/
10+
#include <cql2cpp/cql2cpp.h>
1011
#include <gtest/gtest.h>
1112
#include <sqlite3.h>
12-
// #include <spatialite.h>
13+
//
14+
#include <spatialite.h>
1315

14-
TEST(WHERE, CASE1) {
16+
#include <fstream>
17+
18+
TEST(SQL_SPATIAL, CASE1) {
19+
spatialite_init(0);
1520
sqlite3 *db;
1621
sqlite3_open("./test.sqlite", &db);
1722
char *error_msg = 0;
18-
sqlite3_exec(db, "PRAGMA strict = OFF;", NULL, 0, &error_msg);
19-
sqlite3_exec(
20-
db, "CREATE TABLE IF NOT EXISTS feature(ID INT PRIMARY KEY, NAME TEXT)",
21-
NULL, 0, &error_msg);
22-
23-
std::string sql = "SELECT * FROM feature WHERE field = \"Yu\";";
24-
sqlite3_stmt *stmt;
25-
int rc = sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, NULL);
26-
if (rc != SQLITE_OK)
27-
std::cerr << "prepare error " << rc << ": " << sqlite3_errmsg(db) << std::endl;
23+
24+
int ret;
25+
26+
ret = sqlite3_enable_load_extension(db, 1);
27+
EXPECT_EQ(ret, SQLITE_OK);
28+
29+
ret = sqlite3_load_extension(db, "mod_spatialite.so", NULL, NULL);
30+
31+
ret = sqlite3_exec(db, "PRAGMA strict = OFF;", NULL, 0, &error_msg);
32+
if (ret != SQLITE_OK) LOG(ERROR) << error_msg;
33+
EXPECT_EQ(ret, SQLITE_OK);
34+
35+
ret = sqlite3_exec(db, "SELECT spatialite_version();", NULL, 0, &error_msg);
36+
if (ret != SQLITE_OK) LOG(ERROR) << error_msg;
37+
EXPECT_EQ(ret, SQLITE_OK);
38+
39+
ret = sqlite3_exec(db,
40+
"CREATE TABLE IF NOT EXISTS feature(ID INT PRIMARY KEY);",
41+
NULL, 0, &error_msg);
42+
if (ret != SQLITE_OK) LOG(ERROR) << error_msg;
43+
EXPECT_EQ(ret, SQLITE_OK);
44+
45+
ret = sqlite3_exec(db,
46+
"SELECT AddGeometryColumn('feature', 'geom', 4326, 'POLYGON', 'XY');",
47+
NULL, 0, &error_msg);
48+
if (ret != SQLITE_OK) LOG(ERROR) << error_msg;
49+
EXPECT_EQ(ret, SQLITE_OK);
50+
51+
ret = sqlite3_exec(
52+
db, "SELECT * FROM feature WHERE ST_INTERSECTS('geom' ,ST_GeomFromText('POINT(36 32)'));", NULL,
53+
0, &error_msg);
54+
if (ret != SQLITE_OK) LOG(ERROR) << error_msg;
55+
EXPECT_EQ(ret, SQLITE_OK);
2856
}
2957

58+
class SqlTest : public testing::Test {
59+
protected:
60+
std::string case_name_;
61+
std::string prefix_;
62+
63+
public:
64+
void SetUp() override {
65+
FLAGS_colorlogtostderr = true;
66+
case_name_ = std::string(
67+
testing::UnitTest::GetInstance()->current_test_info()->name());
68+
prefix_ = "supported/1.0/examples/text/";
69+
spatialite_init(0);
70+
}
71+
void TearDown() override {}
72+
static std::string hyphen(const std::string &case_name) {
73+
std::string s = case_name;
74+
std::replace(s.begin(), s.end(), '_', '-');
75+
return s;
76+
}
77+
78+
bool Parse(const std::string &case_name) {
79+
std::ifstream fin(prefix_ + case_name + ".txt");
80+
EXPECT_TRUE(fin.good());
81+
EXPECT_TRUE(fin.is_open());
82+
std::string query;
83+
query.assign(std::istreambuf_iterator<char>(fin),
84+
std::istreambuf_iterator<char>());
85+
fin.close();
86+
87+
LOG(INFO) << query;
88+
89+
// Create DB
90+
sqlite3 *db;
91+
sqlite3_open("./test.sqlite", &db);
92+
char *error_msg = 0;
93+
sqlite3_enable_load_extension(db, 1);
94+
sqlite3_load_extension(db, "mod_spatialite.so", NULL, NULL);
95+
sqlite3_exec(db, "PRAGMA strict = OFF;", NULL, 0, &error_msg);
96+
sqlite3_exec(db, "SELECT load_extension('mod_spatialite');", NULL, 0,
97+
&error_msg);
98+
sqlite3_exec(db,
99+
"CREATE TABLE IF NOT EXISTS feature(ID INT PRIMARY KEY, "
100+
"PLACEHOLDER TEXT)",
101+
NULL, 0, &error_msg);
102+
103+
// Parse query to get queryables
104+
cql2cpp::Cql2Cpp<void *> cql2cpp;
105+
std::string error_str;
106+
auto root = cql2cpp.ParseAsAst(query, &error_str);
107+
108+
// add queryables into table
109+
std::set<std::string> queryables;
110+
for (const auto &node : *root) {
111+
if (node->type() == cql2cpp::NodeType::PropertyName)
112+
queryables.insert(value_str(node->origin_value()));
113+
}
114+
for (const auto &queryable : queryables)
115+
sqlite3_exec(
116+
db,
117+
("ALTER TABLE feature ADD COLUMN " + queryable + " TEXT;").c_str(),
118+
NULL, 0, &error_msg);
119+
120+
std::string sql_where;
121+
std::string err_str;
122+
EXPECT_TRUE(cql2cpp.ConvertToSQL(query, &sql_where, &err_str));
123+
124+
// use "prepare" to check the WHERE clause
125+
std::string sql = "SELECT * FROM feature WHERE " + sql_where;
126+
sqlite3_stmt *stmt;
127+
int rc = sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, NULL);
128+
if (rc != SQLITE_OK)
129+
std::cerr << "prepare error " << rc << ": " << sqlite3_errmsg(db)
130+
<< std::endl;
131+
return rc == SQLITE_OK;
132+
}
133+
};
134+
135+
// TEST_F(SqlTest, clause6_01) { EXPECT_TRUE(Parse(case_name_)); }
136+
TEST_F(SqlTest, clause6_02a) { EXPECT_TRUE(Parse(case_name_)); }
137+
// TEST_F(SqlTest, clause6_02b) { EXPECT_TRUE(Parse(case_name_)); }
138+
TEST_F(SqlTest, clause6_02c) { EXPECT_TRUE(Parse(case_name_)); }
139+
TEST_F(SqlTest, clause6_03) { EXPECT_TRUE(Parse(case_name_)); }
140+
TEST_F(SqlTest, clause7_01) { EXPECT_TRUE(Parse(case_name_)); }
141+
TEST_F(SqlTest, clause7_02) { EXPECT_TRUE(Parse(case_name_)); }
142+
TEST_F(SqlTest, clause7_03a) { EXPECT_TRUE(Parse(case_name_)); }
143+
TEST_F(SqlTest, clause7_03b) { EXPECT_TRUE(Parse(case_name_)); }
144+
// TEST_F(SqlTest, clause7_07) { EXPECT_TRUE(Parse(case_name_)); }
145+
// TEST_F(SqlTest, clause7_10) { EXPECT_TRUE(Parse(case_name_)); }
146+
// TEST_F(SqlTest, clause7_15) { EXPECT_TRUE(Parse(case_name_)); }
147+
// TEST_F(SqlTest, clause7_16) { EXPECT_TRUE(Parse(case_name_)); }
148+
TEST_F(SqlTest, clause7_19) { EXPECT_TRUE(Parse(case_name_)); }
149+
// TEST_F(SqlTest, example01) { EXPECT_TRUE(Parse(case_name_)); }
150+
// TEST_F(SqlTest, example02) { EXPECT_TRUE(Parse(case_name_)); }
151+
// TEST_F(SqlTest, example03) { EXPECT_TRUE(Parse(case_name_)); }
152+
// TEST_F(SqlTest, example04) { EXPECT_TRUE(Parse(case_name_)); }
153+
// TEST_F(SqlTest, example05a) { EXPECT_TRUE(Parse(case_name_)); }
154+
// TEST_F(SqlTest, example05b) { EXPECT_TRUE(Parse(case_name_)); }
155+
// TEST_F(SqlTest, example06a) { EXPECT_TRUE(Parse(case_name_)); }
156+
// TEST_F(SqlTest, example06b) { EXPECT_TRUE(Parse(case_name_)); }
157+
// TEST_F(SqlTest, example07) { EXPECT_TRUE(Parse(case_name_)); }
158+
// TEST_F(SqlTest, example08) { EXPECT_TRUE(Parse(case_name_)); }
159+
// TEST_F(SqlTest, example09) { EXPECT_TRUE(Parse(case_name_)); }
160+
// TEST_F(SqlTest, example10) { EXPECT_TRUE(Parse(case_name_)); }
161+
// TEST_F(SqlTest, example11) { EXPECT_TRUE(Parse(case_name_)); }
162+
// TEST_F(SqlTest, example12) { EXPECT_TRUE(Parse(case_name_)); }
163+
// TEST_F(SqlTest, example13) { EXPECT_TRUE(Parse(case_name_)); }
164+
// TEST_F(SqlTest, example14) { EXPECT_TRUE(Parse(case_name_)); }
165+
// TEST_F(SqlTest, example15) { EXPECT_TRUE(Parse(case_name_)); }
166+
// TEST_F(SqlTest, example16) { EXPECT_TRUE(Parse(case_name_)); }
167+
// TEST_F(SqlTest, example17) { EXPECT_TRUE(Parse(case_name_)); }
168+
// TEST_F(SqlTest, example18) { EXPECT_TRUE(Parse(case_name_)); }
169+
// TEST_F(SqlTest, example19) { EXPECT_TRUE(Parse(case_name_)); }
170+
// TEST_F(SqlTest, example23) { EXPECT_TRUE(Parse(case_name_)); }
171+
// TEST_F(SqlTest, example24) { EXPECT_TRUE(Parse(case_name_)); }
172+
// TEST_F(SqlTest, example25) { EXPECT_TRUE(Parse(case_name_)); }
173+
// TEST_F(SqlTest, example28) { EXPECT_TRUE(Parse(case_name_)); }
174+
// TEST_F(SqlTest, example29) { EXPECT_TRUE(Parse(case_name_)); }
175+
// TEST_F(SqlTest, example30) { EXPECT_TRUE(Parse(case_name_)); }
176+
// TEST_F(SqlTest, example31) { EXPECT_TRUE(Parse(case_name_)); }
177+
// TEST_F(SqlTest, example32) { EXPECT_TRUE(Parse(case_name_)); }
178+
// TEST_F(SqlTest, example33) { EXPECT_TRUE(Parse(case_name_)); }
179+
// TEST_F(SqlTest, example34) { EXPECT_TRUE(Parse(case_name_)); }
180+
// TEST_F(SqlTest, example35) { EXPECT_TRUE(Parse(case_name_)); }
181+
// TEST_F(SqlTest, example36) { EXPECT_TRUE(Parse(case_name_)); }
182+
// TEST_F(SqlTest, example36_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); }
183+
// TEST_F(SqlTest, example37) { EXPECT_TRUE(Parse(case_name_)); }
184+
// TEST_F(SqlTest, example38) { EXPECT_TRUE(Parse(case_name_)); }
185+
// TEST_F(SqlTest, example38_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); }
186+
// TEST_F(SqlTest, example39) { EXPECT_TRUE(Parse(case_name_)); }
187+
// TEST_F(SqlTest, example40) { EXPECT_TRUE(Parse(case_name_)); }
188+
// TEST_F(SqlTest, example40_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); }
189+
// TEST_F(SqlTest, example41) { EXPECT_TRUE(Parse(case_name_)); }
190+
// TEST_F(SqlTest, example42) { EXPECT_TRUE(Parse(case_name_)); }
191+
// TEST_F(SqlTest, example42_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); }
192+
// TEST_F(SqlTest, example43) { EXPECT_TRUE(Parse(case_name_)); }
193+
// TEST_F(SqlTest, example43_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); }
194+
// TEST_F(SqlTest, example44) { EXPECT_TRUE(Parse(case_name_)); }
195+
// TEST_F(SqlTest, example44_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); }
196+
// TEST_F(SqlTest, example46) { EXPECT_TRUE(Parse(case_name_)); }
197+
// TEST_F(SqlTest, example46_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); }
198+
// TEST_F(SqlTest, example47) { EXPECT_TRUE(Parse(case_name_)); }
199+
// TEST_F(SqlTest, example48) { EXPECT_TRUE(Parse(case_name_)); }
200+
// TEST_F(SqlTest, example49_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); }
201+
// TEST_F(SqlTest, example50) { EXPECT_TRUE(Parse(case_name_)); }
202+
// TEST_F(SqlTest, example51) { EXPECT_TRUE(Parse(case_name_)); }
203+
// TEST_F(SqlTest, example52) { EXPECT_TRUE(Parse(case_name_)); }
204+
// TEST_F(SqlTest, example68) { EXPECT_TRUE(Parse(case_name_)); }
205+
// TEST_F(SqlTest, example69) { EXPECT_TRUE(Parse(case_name_)); }
206+
// TEST_F(SqlTest, example71) { EXPECT_TRUE(Parse(case_name_)); }
207+
// TEST_F(SqlTest, example72) { EXPECT_TRUE(Parse(case_name_)); }
208+
// TEST_F(SqlTest, example73) { EXPECT_TRUE(Parse(case_name_)); }
209+
// TEST_F(SqlTest, example74) { EXPECT_TRUE(Parse(case_name_)); }
210+
// TEST_F(SqlTest, example75) { EXPECT_TRUE(Parse(case_name_)); }
211+
// TEST_F(SqlTest, example76) { EXPECT_TRUE(Parse(case_name_)); }
212+
// TEST_F(SqlTest, example77) { EXPECT_TRUE(Parse(case_name_)); }
213+
// TEST_F(SqlTest, example78) { EXPECT_TRUE(Parse(case_name_)); }
214+
// TEST_F(SqlTest, example79) { EXPECT_TRUE(Parse(case_name_)); }
215+
// TEST_F(SqlTest, example80) { EXPECT_TRUE(Parse(case_name_)); }
216+
// TEST_F(SqlTest, example81) { EXPECT_TRUE(Parse(case_name_)); }
217+
// TEST_F(SqlTest, example83) { EXPECT_TRUE(Parse(case_name_)); }
218+
// TEST_F(SqlTest, example84) { EXPECT_TRUE(Parse(case_name_)); }
219+
// TEST_F(SqlTest, example85) { EXPECT_TRUE(Parse(case_name_)); }
220+
// TEST_F(SqlTest, example85_alt01) { EXPECT_TRUE(Parse(hyphen(case_name_))); }
221+
// TEST_F(SqlTest, example86) { EXPECT_TRUE(Parse(case_name_)); }

0 commit comments

Comments
 (0)