 {
   INNER,
   LEFT
+  // TODO Add OUTER join (need to implement computing reference solution to outer join)
 };
 
 // Each element of the result will be an index into the left and right columns where

// template argument to TestParameters
typedef ::testing::Types< 
                          // Single column inner join tests for all types
                          TestParameters< join_kind::INNER, std::tuple<std::vector<int32_t>> >,
                          TestParameters< join_kind::INNER, std::tuple<std::vector<int64_t>> >,
                          TestParameters< join_kind::INNER, std::tuple<std::vector<float>> >,
                          TestParameters< join_kind::INNER, std::tuple<std::vector<double>> >,
                          TestParameters< join_kind::INNER, std::tuple<std::vector<uint32_t>> >,
                          TestParameters< join_kind::INNER, std::tuple<std::vector<uint64_t>> >,
                          // Single column left join tests for all types
                          TestParameters< join_kind::LEFT, std::tuple<std::vector<int32_t>> >,
                          TestParameters< join_kind::LEFT, std::tuple<std::vector<int64_t>> >,
                          TestParameters< join_kind::LEFT, std::tuple<std::vector<float>> >,
                          TestParameters< join_kind::LEFT, std::tuple<std::vector<double>> >,
                          TestParameters< join_kind::LEFT, std::tuple<std::vector<uint32_t>> >,
                          TestParameters< join_kind::LEFT, std::tuple<std::vector<uint64_t>> >,
                          // Two Column Left Join tests for some combination of types
                          TestParameters< join_kind::LEFT, std::tuple<std::vector<int32_t>, std::vector<int32_t>> >,
                          TestParameters< join_kind::LEFT, std::tuple<std::vector<int64_t>, std::vector<int32_t>> >,
                          TestParameters< join_kind::LEFT, std::tuple<std::vector<float>, std::vector<double>> >,
                          TestParameters< join_kind::LEFT, std::tuple<std::vector<double>, std::vector<int64_t>> >,
                          TestParameters< join_kind::LEFT, std::tuple<std::vector<uint32_t>, std::vector<int32_t>> >,
                          // Three Column Left Join tests for some combination of types
                          TestParameters< join_kind::LEFT, std::tuple<std::vector<int32_t>, std::vector<uint32_t>, std::vector<float>> >,
                          TestParameters< join_kind::LEFT, std::tuple<std::vector<uint64_t>, std::vector<uint32_t>, std::vector<float>> >,
                          TestParameters< join_kind::LEFT, std::tuple<std::vector<float>, std::vector<double>, std::vector<float>> >,
                          TestParameters< join_kind::LEFT, std::tuple<std::vector<double>, std::vector<uint32_t>, std::vector<int64_t>> >
                          // Four column test will fail because gdf_join is limited to 3 columns
                          //TestParameters< join_kind::LEFT, std::tuple<std::vector<double>, std::vector<uint32_t>, std::vector<int64_t>, std::vector<int32_t>> >
                          > Implementations;


TYPED_TEST(JoinTest, ExampleTest)
{
  this->create_input(10,2,
                     10,2,
                     true);

  std::vector<result_type> reference_result = this->compute_reference_solution(true);

  std::vector<result_type> gdf_result = this->compute_gdf_result(true);

  ASSERT_EQ(reference_result.size(), gdf_result.size()) << "Size of gdf result does not match reference result\n";

