24#include <fmt/format.h>
25#include <boost/test/unit_test.hpp>
26#include <nanodbc/nanodbc.h>
35 std::string cs = fmt::format(
"Driver={{SQLite3}};Database={}/database.sqlite",
36 QA_DATABASE_FILE_LOCATION );
40 BOOST_CHECK_NO_THROW( dc.
Connect() );
63 BOOST_CHECK( dc.
SelectOne(
"Resistors", std::make_pair(
"Part ID",
"RES-001" ),
result ) );
65 BOOST_CHECK( !
result.empty() );
66 BOOST_CHECK(
result.count(
"MPN" ) );
67 BOOST_CHECK_NO_THROW( std::any_cast<std::string>(
result.at(
"MPN" ) ) );
70 BOOST_CHECK( dc.
SelectOne(
"Capacitors", std::make_pair(
"Part ID",
"CAP-003" ),
result ) );
72 BOOST_CHECK( !
result.empty() );
73 BOOST_CHECK(
result.count(
"Cost" ) );
74 BOOST_CHECK_NO_THROW( std::any_cast<std::string>(
result.at(
"Cost" ) ) );
90 std::string cs = fmt::format(
"Driver={{SQLite3}};Database={}/database.sqlite",
91 QA_DATABASE_FILE_LOCATION );
99 dc.
CacheTableInfo(
"GeneratedTest", {
"part id",
"value",
"resistance",
"fulldesc" } );
103 BOOST_CHECK( dc.
SelectOne(
"GeneratedTest", std::make_pair(
"Part ID",
"GEN-001" ),
result ) );
104 BOOST_CHECK( !
result.empty() );
107 BOOST_CHECK(
result.count(
"FullDesc" ) );
108 BOOST_CHECK_NO_THROW( std::any_cast<std::string>(
result.at(
"FullDesc" ) ) );
112 BOOST_CHECK(
result.count(
"Value" ) );
121 m_path(
std::filesystem::temp_directory_path()
122 / fmt::format(
"kicad_qa_{}.sqlite",
std::random_device()() ) )
129 std::filesystem::remove(
m_path, ec );
134 return fmt::format(
"Driver={{SQLite3}};Database={}",
m_path.string() );
140 nanodbc::connection conn( nanodbc::string( cs.begin(), cs.end() ) );
141 nanodbc::execute( conn, nanodbc::string( aSql.begin(), aSql.end() ) );
152 db.
Execute(
"CREATE TABLE \"Part \"\"A\"\"\" (\"Part ID\" TEXT, \"Va\"\"lue\" TEXT)" );
153 db.
Execute(
"INSERT INTO \"Part \"\"A\"\"\" VALUES ('P1', '10K'), ('P2', '22K')" );
155 const std::string
table =
"Part \"A\"";
156 const std::string column =
"Va\"lue";
163 std::vector<DATABASE_CONNECTION::ROW> rows;
189 db.
Execute(
"CREATE TABLE PartAData (\"Part ID\" TEXT, Value TEXT)" );
190 db.
Execute(
"CREATE TABLE PartABCData (\"Part ID\" TEXT, Value TEXT)" );
191 db.
Execute(
"CREATE TABLE \"Part_%Data\" (\"Part ID\" TEXT, Value TEXT)" );
192 db.
Execute(
"INSERT INTO PartAData VALUES ('P1', 'wrong A')" );
193 db.
Execute(
"INSERT INTO PartABCData VALUES ('P1', 'wrong ABC')" );
194 db.
Execute(
"INSERT INTO \"Part_%Data\" VALUES ('P1', 'right')" );
std::map< std::string, std::any > ROW
void SetCacheParams(int aMaxSize, int aMaxAge)
bool SelectAll(const std::string &aTable, const std::string &aKey, std::vector< ROW > &aResults)
Retrieves all rows from a database table.
bool SelectOne(const std::string &aTable, const std::pair< std::string, std::string > &aWhere, ROW &aResult)
Retrieves a single row from a database table.
std::string GetLastError() const
bool CacheTableInfo(const std::string &aTable, const std::set< std::string > &aRequiredColumns, const std::set< std::string > &aOptionalColumns={})
Caches schema information for a table so that subsequent queries know which columns exist.
A throwaway SQLite database whose tables are created by the test.
void Execute(const std::string &aSql) const
std::filesystem::path m_path
std::string ConnectionString() const
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_AUTO_TEST_SUITE(CadstarPartParser)
BOOST_AUTO_TEST_CASE(Connect)
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
BOOST_AUTO_TEST_SUITE_END()
wxString result
Test unit parsing edge cases and error handling.
BOOST_CHECK_EQUAL(result, "25.4")