Skip to content

Commit

Permalink
Add unit-tests for CppBuilder<>::eligible
Browse files Browse the repository at this point in the history
  • Loading branch information
dubzzz committed Oct 23, 2015
1 parent 691421d commit 3a15b86
Show file tree
Hide file tree
Showing 2 changed files with 169 additions and 7 deletions.
18 changes: 11 additions & 7 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -12,23 +12,27 @@ all: build examples

# *.o files compilation

mkdir_test:
build/test/test-py2cpp.o: test/test-py2cpp.cpp
mkdir -p build/test

build/test/test-py2cpp.o: mkdir_test test/test-py2cpp.cpp
$(CC) -o build/test/test-py2cpp.o -c test/test-py2cpp.cpp $(CFLAGS) $(CGTEST)

build/test/helper.o: mkdir_test test/helper.hpp test/helper.cpp
build/test/helper.o: test/helper.hpp test/helper.cpp
mkdir -p build/test
$(CC) -o build/test/helper.o -c test/helper.cpp $(CFLAGS) $(CGTEST)

build/test/test-py2cpp-builder.o: mkdir_test test/test-py2cpp-builder.cpp src/py2cpp.hpp
build/test/test-py2cpp-builder.o: test/test-py2cpp-builder.cpp src/py2cpp.hpp
mkdir -p build/test
$(CC) -o build/test/test-py2cpp-builder.o -c test/test-py2cpp-builder.cpp $(CFLAGS) $(CGTEST)

build/test/test-py2cpp-eligible.o: test/test-py2cpp-eligible.cpp src/py2cpp.hpp
mkdir -p build/test
$(CC) -o build/test/test-py2cpp-eligible.o -c test/test-py2cpp-eligible.cpp $(CFLAGS) $(CGTEST)

# Binaries

build/py2cpp.out: build/test/test-py2cpp.o build/test/test-py2cpp-builder.o build/test/helper.o
build/py2cpp.out: build/test/test-py2cpp.o build/test/test-py2cpp-builder.o build/test/test-py2cpp-eligible.o build/test/helper.o
mkdir -p build
$(CC) -o build/py2cpp.out build/test/test-py2cpp.o build/test/test-py2cpp-builder.o build/test/helper.o $(LDFLAGS) $(LDGTEST)
$(CC) -o build/py2cpp.out build/test/test-py2cpp.o build/test/test-py2cpp-builder.o build/test/test-py2cpp-eligible.o build/test/helper.o $(LDFLAGS) $(LDGTEST)

# Allowed commands

Expand Down
158 changes: 158 additions & 0 deletions test/test-py2cpp-eligible.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
#include <Python.h>
#include "gtest/gtest.h"

#include <limits>
#include <memory>
#include <sstream>

#include "src/py2cpp.hpp"
#include "test/helper.hpp"

using namespace dubzzz::Py2Cpp;

static std::string maxLL()
{
std::ostringstream out;
out << LLONG_MAX;
return out.str();
}

template <class BUILDER>
static void filterThrow(BUILDER const& builder, PyObject* pyo)
{
try
{
builder(pyo);
}
catch(std::invalid_argument const&)
{
throw;
}
catch(...) {}
}

template <class BUILDER>
static void shouldBeEligible(BUILDER const& builder, std::string const& pyQuery)
{
std::unique_ptr<PyObject, decref> pyo { PyRun_String(pyQuery.c_str(), Py_eval_input, get_py_dict(), NULL) };
EXPECT_TRUE(builder.eligible(pyo.get())) << "Conversion should be possible for: '" << pyQuery << "'";
EXPECT_NO_THROW(filterThrow(builder, pyo.get())) << "Conversion should be possible for: '" << pyQuery << "'";;
}
template <class BUILDER>
static void shouldNotBeEligible(BUILDER const& builder, std::string const& pyQuery)
{
std::unique_ptr<PyObject, decref> pyo { PyRun_String(pyQuery.c_str(), Py_eval_input, get_py_dict(), NULL) };
EXPECT_FALSE(builder.eligible(pyo.get())) << "Conversion should not be possible for: '" << pyQuery << "'";
EXPECT_THROW(builder(pyo.get()), std::invalid_argument) << "Conversion should not be possible for: '" << pyQuery << "'";
}

TEST(CppBuilder_eligible, bool)
{
auto builder = CppBuilder<bool>();

shouldBeEligible(builder, "True");

shouldNotBeEligible(builder, "None");
shouldNotBeEligible(builder, "1");
shouldNotBeEligible(builder, maxLL());
shouldNotBeEligible(builder, "1.2");
shouldNotBeEligible(builder, "'This is a string'");
shouldNotBeEligible(builder, "u'This is a unicode string'");
shouldNotBeEligible(builder, "(1,2,3)");
shouldNotBeEligible(builder, "[1,2,3]");
shouldNotBeEligible(builder, "set([1,2,3])");
shouldNotBeEligible(builder, "{'x': 1, 'y': 2, 'z': 3}");
}

template <class TYPE>
static void testInteger()
{
auto builder = CppBuilder<TYPE>();

shouldBeEligible(builder, "True");
shouldBeEligible(builder, "1");
shouldBeEligible(builder, maxLL());

shouldNotBeEligible(builder, "None");
shouldNotBeEligible(builder, "1.2");
shouldNotBeEligible(builder, "'This is a string'");
shouldNotBeEligible(builder, "u'This is a unicode string'");
shouldNotBeEligible(builder, "(1,2,3)");
shouldNotBeEligible(builder, "[1,2,3]");
shouldNotBeEligible(builder, "set([1,2,3])");
shouldNotBeEligible(builder, "{'x': 1, 'y': 2, 'z': 3}");
}

TEST(CppBuilder_eligible, int)
{
testInteger<int>();
}
TEST(CppBuilder_eligible, unsigned_int)
{
testInteger<unsigned int>();
}

TEST(CppBuilder_eligible, long)
{
testInteger<long>();
}
TEST(CppBuilder_eligible, unsigned_long)
{
testInteger<unsigned long>();
}

TEST(CppBuilder_eligible, long_long)
{
testInteger<long long>();
}
TEST(CppBuilder_eligible, unsigned_long_long)
{
testInteger<unsigned long long>();
}

TEST(CppBuilder_eligible, double)
{
auto builder = CppBuilder<double>();

shouldBeEligible(builder, "True");
shouldBeEligible(builder, "1");
shouldBeEligible(builder, maxLL());
shouldBeEligible(builder, "1.2");

shouldNotBeEligible(builder, "None");
shouldNotBeEligible(builder, "'This is a string'");
shouldNotBeEligible(builder, "u'This is a unicode string'");
shouldNotBeEligible(builder, "(1,2,3)");
shouldNotBeEligible(builder, "[1,2,3]");
shouldNotBeEligible(builder, "set([1,2,3])");
shouldNotBeEligible(builder, "{'x': 1, 'y': 2, 'z': 3}");
}

template <class TYPE>
static void testString()
{
auto builder = CppBuilder<TYPE>();

shouldBeEligible(builder, "'This is a string'");
shouldBeEligible(builder, "u'This is a unicode string'");

shouldNotBeEligible(builder, "None");
shouldNotBeEligible(builder, "True");
shouldNotBeEligible(builder, "1");
shouldNotBeEligible(builder, maxLL());
shouldNotBeEligible(builder, "1.2");
shouldNotBeEligible(builder, "(1,2,3)");
shouldNotBeEligible(builder, "[1,2,3]");
shouldNotBeEligible(builder, "set([1,2,3])");
shouldNotBeEligible(builder, "{'x': 1, 'y': 2, 'z': 3}");
}

TEST(CppBuilder_eligible, string)
{
testString<std::string>();
}
TEST(CppBuilder_eligible, wstring)
{
testString<std::wstring>();
}

0 comments on commit 3a15b86

Please sign in to comment.