diff --git a/tests/test_PolynomialReconstruction.cpp b/tests/test_PolynomialReconstruction.cpp
index d90d0e84a153d67834942756ddb18cc746c5b05b..5242b6b041dda5429a6c3509f4b0523e4924b5ac 100644
--- a/tests/test_PolynomialReconstruction.cpp
+++ b/tests/test_PolynomialReconstruction.cpp
@@ -17,13 +17,28 @@
 
 #include <MeshDataBaseForTests.hpp>
 
-template <typename... DataType>
+template <typename... DiscreteFunctionT>
 std::vector<std::shared_ptr<const DiscreteFunctionVariant>>
-build_list(DiscreteFunctionP0<DataType>... input)
+build_list(DiscreteFunctionT... input)
 {
   std::vector<std::shared_ptr<const DiscreteFunctionVariant>> variant_vector;
-  variant_vector.push_back(std::make_shared<DiscreteFunctionVariant>(input...));
+  auto convert = [&variant_vector](auto&& df) {
+    using DF_T = std::decay_t<decltype(df)>;
+    if constexpr (is_discrete_function_v<DF_T> or std::is_same_v<DiscreteFunctionVariant, DF_T>) {
+      variant_vector.push_back(std::make_shared<DiscreteFunctionVariant>(df));
+    } else if constexpr (is_shared_ptr_v<DF_T>) {
+      using DF_Value_T = std::decay_t<typename DF_T::element_type>;
+      if constexpr (is_discrete_function_v<DF_Value_T> or std::is_same_v<DiscreteFunctionVariant, DF_Value_T>) {
+        variant_vector.push_back(std::make_shared<DiscreteFunctionVariant>(*df));
+      } else {
+        static_assert(is_false_v<DF_T>, "unexpected type");
+      }
+    } else {
+      static_assert(is_false_v<DF_T>, "unexpected type");
+    }
+  };
 
+  (convert(input), ...);
   return variant_vector;
 }
 
@@ -51,7 +66,10 @@ TEST_CASE("PolynomialReconstruction", "[scheme]")
           parallel_for(
             mesh.numberOfCells(), PUGS_LAMBDA(const CellId cell_id) { fh[cell_id] = affine(xj[cell_id]); });
 
-          auto reconstructions = PolynomialReconstruction{}.build(build_list(fh));
+          DiscreteFunctionVariant fh_v(fh);
+          std::shared_ptr<const DiscreteFunctionVariant> p_fh_v = std::make_shared<DiscreteFunctionVariant>(fh);
+
+          auto reconstructions = PolynomialReconstruction{}.build(build_list(p_fh_v, fh_v, fh));
 
           auto dpk = reconstructions[0]->get<DiscreteFunctionDPk<1, const double>>();