mirror of
https://github.com/opencv/opencv.git
synced 2026-07-30 07:43:03 +04:00
Merge pull request #28482 from satyam102006:core/yaml-1-2-support
core: add YAML 1.2 support for FileStorage #28482 Fixes: #26363 CI Update: https://github.com/opencv/ci-gha-workflow/pull/306 Summary: - Bool true/false literals support - Header-less YAMLs support for Python YAML module compatibility. Header-less files are parsed as YAMLs by default - Added FORMAT_YAML_1_0 flag to FileStorage for fallback. - New YAML1.2 header Testing: - Added Core_InputOutput.YAML_1_2_Compatibility test case in test_io.cpp. - Added YAML interop test in Python
This commit is contained in:
@@ -499,7 +499,7 @@ TEST(Core_InputOutput, FileStorageKey)
|
||||
EXPECT_NO_THROW(f << "key1" << "value1");
|
||||
EXPECT_NO_THROW(f << "_key2" << "value2");
|
||||
EXPECT_NO_THROW(f << "key_3" << "value3");
|
||||
const std::string expected = "%YAML:1.0\n---\nkey1: value1\n_key2: value2\nkey_3: value3\n";
|
||||
const std::string expected = "%YAML 1.2\n---\nkey1: value1\n_key2: value2\nkey_3: value3\n";
|
||||
ASSERT_STREQ(f.releaseAndGetString().c_str(), expected.c_str());
|
||||
}
|
||||
|
||||
@@ -1199,7 +1199,7 @@ TEST(Core_InputOutput, FileStorage_DMatch)
|
||||
|
||||
EXPECT_NO_THROW(fs << "d" << d);
|
||||
cv::String fs_result = fs.releaseAndGetString();
|
||||
EXPECT_STREQ(fs_result.c_str(), "%YAML:1.0\n---\nd: [ 1, 2, 3, -1.5 ]\n");
|
||||
EXPECT_STREQ(fs_result.c_str(), "%YAML 1.2\n---\nd: [ 1, 2, 3, -1.5 ]\n");
|
||||
|
||||
cv::FileStorage fs_read(fs_result, cv::FileStorage::READ | cv::FileStorage::MEMORY);
|
||||
|
||||
@@ -1227,7 +1227,7 @@ TEST(Core_InputOutput, FileStorage_DMatch_vector)
|
||||
EXPECT_NO_THROW(fs << "dv" << dv);
|
||||
cv::String fs_result = fs.releaseAndGetString();
|
||||
EXPECT_STREQ(fs_result.c_str(),
|
||||
"%YAML:1.0\n"
|
||||
"%YAML 1.2\n"
|
||||
"---\n"
|
||||
"dv:\n"
|
||||
" - [ 1, 2, 3, -1.5 ]\n"
|
||||
@@ -1274,7 +1274,7 @@ TEST(Core_InputOutput, FileStorage_DMatch_vector_vector)
|
||||
cv::String fs_result = fs.releaseAndGetString();
|
||||
#ifndef OPENCV_TRAITS_ENABLE_DEPRECATED
|
||||
EXPECT_STREQ(fs_result.c_str(),
|
||||
"%YAML:1.0\n"
|
||||
"%YAML 1.2\n"
|
||||
"---\n"
|
||||
"dvv:\n"
|
||||
" -\n"
|
||||
@@ -2278,4 +2278,50 @@ INSTANTIATE_TEST_CASE_P(Core_InputOutput,
|
||||
FileStorage_exact_type, Values(".yml", ".xml", ".json")
|
||||
);
|
||||
|
||||
TEST(Core_InputOutput, YAML_Compatibility)
|
||||
{
|
||||
string filename = cv::tempfile(".yaml");
|
||||
|
||||
// 1. Write using DEFAULT (should be 1.2 compatible now)
|
||||
{
|
||||
FileStorage fs(filename, FileStorage::WRITE | FileStorage::FORMAT_YAML);
|
||||
ASSERT_TRUE(fs.isOpened());
|
||||
fs << "bool_true" << true;
|
||||
fs << "bool_false" << false;
|
||||
fs.release();
|
||||
}
|
||||
|
||||
// 2. Verify Default is Modern (Literals + No Legacy Header)
|
||||
{
|
||||
std::ifstream file(filename.c_str());
|
||||
std::stringstream buffer;
|
||||
buffer << file.rdbuf();
|
||||
std::string content = buffer.str();
|
||||
|
||||
EXPECT_NE(content.find("bool_true: true"), std::string::npos); // Found 'true'
|
||||
EXPECT_EQ(content.find("%YAML:1.0"), std::string::npos); // No 1.0 Header
|
||||
}
|
||||
|
||||
// 3. Write using LEGACY flag
|
||||
{
|
||||
FileStorage fs(filename, FileStorage::WRITE | FileStorage::FORMAT_YAML_1_0);
|
||||
ASSERT_TRUE(fs.isOpened());
|
||||
fs << "bool_true" << true;
|
||||
fs.release();
|
||||
}
|
||||
|
||||
// 4. Verify Legacy (Integers + Strict Header)
|
||||
{
|
||||
std::ifstream file(filename.c_str());
|
||||
std::stringstream buffer;
|
||||
buffer << file.rdbuf();
|
||||
std::string content = buffer.str();
|
||||
|
||||
EXPECT_NE(content.find("bool_true: 1"), std::string::npos); // Found '1'
|
||||
EXPECT_NE(content.find("%YAML:1.0"), std::string::npos); // Found 1.0 Header
|
||||
}
|
||||
|
||||
remove(filename.c_str());
|
||||
}
|
||||
|
||||
}} // namespace
|
||||
|
||||
Reference in New Issue
Block a user