]> https://gitweb.dealii.org/ - dealii.git/commitdiff
fix skip undefined for json file 18437/head
authorMagdalena Schreter <magdalena.schreter@tum.de>
Wed, 7 May 2025 22:56:27 +0000 (00:56 +0200)
committerMagdalena Schreter <magdalena.schreter@tum.de>
Thu, 8 May 2025 18:29:57 +0000 (20:29 +0200)
doc/news/changes/minor/20250508Schreter [new file with mode: 0644]
source/base/parameter_handler.cc
tests/parameter_handler/parameter_handler_read_json_06.cc [new file with mode: 0644]
tests/parameter_handler/parameter_handler_read_json_06.output [new file with mode: 0644]
tests/parameter_handler/parameter_handler_read_xml_error_01.output
tests/parameter_handler/prm/parameter_handler_read_json_05.json [new file with mode: 0644]

diff --git a/doc/news/changes/minor/20250508Schreter b/doc/news/changes/minor/20250508Schreter
new file mode 100644 (file)
index 0000000..05523a7
--- /dev/null
@@ -0,0 +1,9 @@
+Fix: Ensure that undefined parameters within nested JSON subnodes
+trigger proper exception handling when using
+ParameterHandler::parse_input_from_json() with skip_undefined set
+to false. Previously, the exception ExcEntryUndeclared was only
+thrown when undefined parameters appeared at the top level of the
+parameter file. This fix extends the check to nested subnode
+entries as well.
+<br>
+(Magdalena Schreter-Fleischhacker, 2025/05/08)
index 53da058a463742e151990837a69425e1e4473eae..1e36a1bc841b68fdc7151eddea675c01b70bb273 100644 (file)
@@ -641,37 +641,30 @@ namespace
         if (p.second.empty())
           {
             // set the found parameter in the destination argument
-            if (skip_undefined)
+            try
               {
-                try
-                  {
-                    prm.set(demangle(p.first), p.second.data());
-                  }
-                catch (const ParameterHandler::ExcEntryUndeclared &)
-                  {
-                    // ignore undeclared entry assert
-                  }
+                prm.set(demangle(p.first), p.second.data());
+              }
+            catch (const ParameterHandler::ExcEntryUndeclared &entry_string)
+              {
+                // ignore undeclared entry assert
+                AssertThrow(skip_undefined,
+                            ParameterHandler::ExcEntryUndeclared(entry_string));
               }
-            else
-              prm.set(demangle(p.first), p.second.data());
           }
         else if (p.second.get_optional<std::string>("value"))
           {
             // set the found parameter in the destination argument
-            if (skip_undefined)
+            try
               {
-                try
-                  {
-                    prm.set(demangle(p.first),
-                            p.second.get<std::string>("value"));
-                  }
-                catch (const ParameterHandler::ExcEntryUndeclared &)
-                  {
-                    // ignore undeclared entry assert
-                  }
+                prm.set(demangle(p.first), p.second.get<std::string>("value"));
+              }
+            catch (const ParameterHandler::ExcEntryUndeclared &entry_string)
+              {
+                // ignore undeclared entry assert
+                AssertThrow(skip_undefined,
+                            ParameterHandler::ExcEntryUndeclared(entry_string));
               }
-            else
-              prm.set(demangle(p.first), p.second.get<std::string>("value"));
 
             // this node might have sub-nodes in addition to "value", such as
             // "default_value", "documentation", etc. we might at some point
@@ -701,9 +694,11 @@ namespace
                                      prm);
                 prm.leave_subsection();
               }
-            catch (const ParameterHandler::ExcEntryUndeclared &)
+            catch (const ParameterHandler::ExcEntryUndeclared &entry_string)
               {
                 // ignore undeclared entry assert
+                AssertThrow(skip_undefined,
+                            ParameterHandler::ExcEntryUndeclared(entry_string));
               }
           }
       }
diff --git a/tests/parameter_handler/parameter_handler_read_json_06.cc b/tests/parameter_handler/parameter_handler_read_json_06.cc
new file mode 100644 (file)
index 0000000..070f773
--- /dev/null
@@ -0,0 +1,53 @@
+// ------------------------------------------------------------------------
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+// Copyright (C) 2010 - 2024 by the deal.II authors
+//
+// This file is part of the deal.II library.
+//
+// Part of the source code is dual licensed under Apache-2.0 WITH
+// LLVM-exception OR LGPL-2.1-or-later. Detailed license information
+// governing the source code and code contributions can be found in
+// LICENSE.md and CONTRIBUTING.md at the top level directory of deal.II.
+//
+// ------------------------------------------------------------------------
+
+
+
+// check ParameterHandler::parse_input_from_json with an undefined parameter
+
+#include <deal.II/base/parameter_handler.h>
+
+#include "../tests.h"
+
+
+int
+main()
+{
+  initlog();
+
+  // default values
+  double double1 = 1.234;
+
+  ParameterHandler prm;
+  prm.enter_subsection("ss1");
+  prm.add_parameter("defined double 1", double1, "doc 3");
+  prm.leave_subsection();
+
+  // read from json
+  std::ifstream in(SOURCE_DIR "/prm/parameter_handler_read_json_05.json");
+  try
+    {
+      prm.parse_input_from_json(in);
+    }
+  catch (const ExceptionBase &e)
+    {
+      deallog << e.get_exc_name() << std::endl;
+      deallog
+        << "ParameterHandler threw an exception with the following message:"
+        << std::endl;
+      e.print_info(deallog.get_file_stream());
+    }
+
+  return 0;
+}
diff --git a/tests/parameter_handler/parameter_handler_read_json_06.output b/tests/parameter_handler/parameter_handler_read_json_06.output
new file mode 100644 (file)
index 0000000..225d3cc
--- /dev/null
@@ -0,0 +1,4 @@
+
+DEAL::ParameterHandler::ExcEntryUndeclared(entry_string)
+DEAL::ParameterHandler threw an exception with the following message:
+    You can't ask for entry <undefined double 1> you have not yet declared.
index b1dd6505d7d6e8cdf4d521b6f11079f407bd82a1..456d7ea062ea4de68f22157f7964ac90a49a9140 100644 (file)
@@ -1,3 +1,3 @@
 
-DEAL::ExcEntryUndeclared(entry_string)
+DEAL::ParameterHandler::ExcEntryUndeclared(entry_string)
     You can't ask for entry <int1234> you have not yet declared.
diff --git a/tests/parameter_handler/prm/parameter_handler_read_json_05.json b/tests/parameter_handler/prm/parameter_handler_read_json_05.json
new file mode 100644 (file)
index 0000000..c375558
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "ss1":
+    {
+        "defined double 1":
+        {
+            "value": "2.234",
+            "default_value": "1.234",
+            "documentation": "doc 3",
+            "pattern": "2",
+            "pattern_description": "[Double -MAX_DOUBLE...MAX_DOUBLE (inclusive)]"
+        },
+        "undefined double 1":
+        {
+            "value": "2.234",
+            "default_value": "1.234",
+            "documentation": "doc 3",
+            "pattern": "2",
+            "pattern_description": "[Double -MAX_DOUBLE...MAX_DOUBLE (inclusive)]"
+        }
+    }
+}

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.