Implement find_or_default

This commit is contained in:
Ken Matsui
2025-01-18 01:15:15 -05:00
parent 499be3c177
commit 4ceba3a8ce
4 changed files with 136 additions and 0 deletions

View File

@@ -673,3 +673,86 @@ TEST_CASE("testing find_or(val, keys..., opt)")
CHECK_EQ(v2, 3.14);
}
}
TEST_CASE("testing find_or_default(val, keys...)")
{
// explicitly specify type, doing type conversion
{
const toml::value v(
toml::table{ {"foo",
toml::table{ {"bar",
toml::table{ {"baz",
42
} }
} }
} }
);
auto v1 = toml::find_or_default<int>(v, "foo", "bar", "baz");
auto v2 = toml::find_or_default<int>(v, "foo", "bar", "qux");
CHECK_EQ(v1, 42);
CHECK_EQ(v2, 0);
}
{
toml::value v(
toml::table{ {"A",
toml::table{ {"B",
toml::table{ {"C",
toml::table{ {"D",
toml::table{ {"E",
toml::table{ {"F",
42
} }
} }
} }
} }
} }
} }
);
auto v1 = toml::find_or_default<int>(v, "A", "B", "C", "D", "E", "F");
auto v2 = toml::find_or_default<int>(v, "A", "B", "C", "D", "E", "G");
CHECK_EQ(v1, 42);
CHECK_EQ(v2, 0);
}
// the value exists, but type is different from the expected.
{
const toml::value v(
toml::table{ {"foo",
toml::table{ {"bar",
toml::table{ {"baz",
42
} }
} }
} }
);
auto v1 = toml::find_or_default<std::string>(v, "foo", "bar", "baz");
auto v2 = toml::find_or_default<double >(v, "foo", "bar", "baz");
CHECK_EQ(v1, "");
CHECK_EQ(v2, 0.);
}
{
const toml::value v(
toml::table{ {"A",
toml::table{ {"B",
toml::table{ {"C",
toml::table{ {"D",
toml::table{ {"E",
toml::table{ {"F",
42
} }
} }
} }
} }
} }
} }
);
auto v1 = toml::find_or_default<std::string>(v, "A", "B", "C", "D", "E", "F");
auto v2 = toml::find_or_default<double >(v, "A", "B", "C", "D", "E", "F");
CHECK_EQ(v1, "");
CHECK_EQ(v2, 0.);
}
}