From de75cf89f732ff82ebacb7d04f32de28e4efa123 Mon Sep 17 00:00:00 2001
From: Niels Lohmann <mail@nlohmann.me>
Date: Sat, 25 Nov 2017 19:41:02 +0100
Subject: [PATCH] :white_check_mark: improved test coverage

---
 test/src/unit-constructor1.cpp |  9 ++++++---
 test/src/unit-conversions.cpp  | 24 ++++++++++++++++++++++++
 test/src/unit-regression.cpp   |  8 ++++++++
 3 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/test/src/unit-constructor1.cpp b/test/src/unit-constructor1.cpp
index e45edd44..d8c9482c 100644
--- a/test/src/unit-constructor1.cpp
+++ b/test/src/unit-constructor1.cpp
@@ -295,9 +295,12 @@ TEST_CASE("constructors")
         {
             json j{1};
 
-            CHECK_THROWS((j.get<std::pair<int, int>>()));
-            CHECK_THROWS((j.get<std::tuple<int, int>>()));
-            CHECK_THROWS((j.get<std::array<int, 3>>()));
+            CHECK_THROWS_AS((j.get<std::pair<int, int>>()), json::out_of_range);
+            CHECK_THROWS_WITH((j.get<std::pair<int, int>>()), "[json.exception.out_of_range.401] array index 1 is out of range");
+            CHECK_THROWS_AS((j.get<std::tuple<int, int>>()), json::out_of_range);
+            CHECK_THROWS_WITH((j.get<std::tuple<int, int>>()), "[json.exception.out_of_range.401] array index 1 is out of range");
+            CHECK_THROWS_AS((j.get<std::array<int, 3>>()), json::out_of_range);
+            CHECK_THROWS_WITH((j.get<std::array<int, 3>>()), "[json.exception.out_of_range.401] array index 1 is out of range");
         }
 
         SECTION("std::forward_list<json>")
diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp
index 6a42bfb8..fc37a1c8 100644
--- a/test/src/unit-conversions.cpp
+++ b/test/src/unit-conversions.cpp
@@ -1009,6 +1009,30 @@ TEST_CASE("value conversion")
                 auto m5 = j5.get<std::forward_list<std::string>>();
             }
 
+            SECTION("std::array")
+            {
+                auto m1 = j1.get<std::array<int, 4>>();
+                auto m2 = j2.get<std::array<unsigned int, 3>>();
+                auto m3 = j3.get<std::array<double, 4>>();
+                auto m4 = j4.get<std::array<bool, 3>>();
+                auto m5 = j5.get<std::array<std::string, 3>>();
+
+                SECTION("std::array is larger than JSON")
+                {
+                    std::array<int, 6> arr6 = {1, 2, 3, 4, 5, 6};
+                    CHECK_THROWS_AS(arr6 = j1, json::out_of_range);
+                    CHECK_THROWS_WITH(arr6 = j1, "[json.exception.out_of_range.401] array index 4 is out of range");
+                }
+
+                SECTION("std::array is smaller than JSON")
+                {
+                    std::array<int, 2> arr2 = {8, 9};
+                    arr2 = j1;
+                    CHECK(arr2[0] == 1);
+                    CHECK(arr2[1] == 2);
+                }
+            }
+
             SECTION("std::valarray")
             {
                 auto m1 = j1.get<std::valarray<int>>();
diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp
index 3b9f6b4a..b6f314c7 100644
--- a/test/src/unit-regression.cpp
+++ b/test/src/unit-regression.cpp
@@ -1305,4 +1305,12 @@ TEST_CASE("regression tests")
         j = {{"nocopy", n}};
         CHECK(j["nocopy"]["val"] == 0);
     }
+
+    SECTION("issue #843 - converting to array not working")
+    {
+        json j;
+        std::array<int, 4> ar = {1, 1, 1, 1};
+        j = ar;
+        ar = j;
+    }
 }