aboutsummaryrefslogtreecommitdiff
path: root/flang-rt/unittests/Runtime
diff options
context:
space:
mode:
Diffstat (limited to 'flang-rt/unittests/Runtime')
-rw-r--r--flang-rt/unittests/Runtime/CMakeLists.txt1
-rw-r--r--flang-rt/unittests/Runtime/InputExtensions.cpp106
-rw-r--r--flang-rt/unittests/Runtime/NumericalFormatTest.cpp2
3 files changed, 109 insertions, 0 deletions
diff --git a/flang-rt/unittests/Runtime/CMakeLists.txt b/flang-rt/unittests/Runtime/CMakeLists.txt
index 49f55a4..cf1e15d 100644
--- a/flang-rt/unittests/Runtime/CMakeLists.txt
+++ b/flang-rt/unittests/Runtime/CMakeLists.txt
@@ -19,6 +19,7 @@ add_flangrt_unittest(RuntimeTests
Derived.cpp
ExternalIOTest.cpp
Format.cpp
+ InputExtensions.cpp
Inquiry.cpp
ListInputTest.cpp
LogicalFormatTest.cpp
diff --git a/flang-rt/unittests/Runtime/InputExtensions.cpp b/flang-rt/unittests/Runtime/InputExtensions.cpp
new file mode 100644
index 0000000..4bb1124
--- /dev/null
+++ b/flang-rt/unittests/Runtime/InputExtensions.cpp
@@ -0,0 +1,106 @@
+//===-- unittests/Runtime/InputExtensions.cpp -------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "CrashHandlerFixture.h"
+#include "flang-rt/runtime/descriptor.h"
+#include "flang/Runtime/io-api.h"
+#include <algorithm>
+#include <array>
+#include <cstring>
+#include <gtest/gtest.h>
+#include <tuple>
+
+using namespace Fortran::runtime;
+using namespace Fortran::runtime::io;
+
+struct InputExtensionTests : CrashHandlerFixture {};
+
+TEST(InputExtensionTests, SeparatorInField_F) {
+ static const struct {
+ int get;
+ const char *format, *data;
+ double expect[3];
+ } test[] = {
+ {2, "(2F6)", "1.25,3.75,", {1.25, 3.75}},
+ {2, "(2F6)", "1.25 ,3.75 ,", {1.25, 3.75}},
+ {2, "(DC,2F6)", "1,25;3,75;", {1.25, 3.75}},
+ {2, "(DC,2F6)", "1,25 ;3,75 ;", {1.25, 3.75}},
+ };
+ for (std::size_t j{0}; j < sizeof test / sizeof *test; ++j) {
+ auto cookie{IONAME(BeginInternalFormattedInput)(test[j].data,
+ std::strlen(test[j].data), test[j].format,
+ std::strlen(test[j].format))};
+ for (int k{0}; k < test[j].get; ++k) {
+ float got;
+ IONAME(InputReal32)(cookie, got);
+ ASSERT_EQ(got, test[j].expect[k])
+ << "expected " << test[j].expect[k] << ", got " << got;
+ }
+ auto status{IONAME(EndIoStatement)(cookie)};
+ ASSERT_EQ(status, 0) << "error status " << status << " on F test case "
+ << j;
+ }
+}
+
+TEST(InputExtensionTests, SeparatorInField_I) {
+ static const struct {
+ int get;
+ const char *format, *data;
+ std::int64_t expect[3];
+ } test[] = {
+ {2, "(2I4)", "12,34,", {12, 34}},
+ {2, "(2I4)", "12 ,34 ,", {12, 34}},
+ {2, "(DC,2I4)", "12;34;", {12, 34}},
+ {2, "(DC,2I4)", "12 ;34 ;", {12, 34}},
+ };
+ for (std::size_t j{0}; j < sizeof test / sizeof *test; ++j) {
+ auto cookie{IONAME(BeginInternalFormattedInput)(test[j].data,
+ std::strlen(test[j].data), test[j].format,
+ std::strlen(test[j].format))};
+ for (int k{0}; k < test[j].get; ++k) {
+ std::int64_t got;
+ IONAME(InputInteger)(cookie, got);
+ ASSERT_EQ(got, test[j].expect[k])
+ << "expected " << test[j].expect[k] << ", got " << got;
+ }
+ auto status{IONAME(EndIoStatement)(cookie)};
+ ASSERT_EQ(status, 0) << "error status " << status << " on I test case "
+ << j;
+ }
+}
+
+TEST(InputExtensionTests, SeparatorInField_L) {
+ static const struct {
+ int get;
+ const char *format, *data;
+ bool expect[3];
+ } test[] = {
+ {2, "(2L4)", ".T,F,", {true, false}},
+ {2, "(2L4)", ".F,T,", {false, true}},
+ {2, "(2L4)", ".T.,F,", {true, false}},
+ {2, "(2L4)", ".F.,T,", {false, true}},
+ {2, "(DC,2L4)", ".T;F,", {true, false}},
+ {2, "(DC,2L4)", ".F;T,", {false, true}},
+ {2, "(DC,2L4)", ".T.;F,", {true, false}},
+ {2, "(DC,2L4)", ".F.;T,", {false, true}},
+ };
+ for (std::size_t j{0}; j < sizeof test / sizeof *test; ++j) {
+ auto cookie{IONAME(BeginInternalFormattedInput)(test[j].data,
+ std::strlen(test[j].data), test[j].format,
+ std::strlen(test[j].format))};
+ for (int k{0}; k < test[j].get; ++k) {
+ bool got;
+ IONAME(InputLogical)(cookie, got);
+ ASSERT_EQ(got, test[j].expect[k])
+ << "expected " << test[j].expect[k] << ", got " << got;
+ }
+ auto status{IONAME(EndIoStatement)(cookie)};
+ ASSERT_EQ(status, 0) << "error status " << status << " on L test case "
+ << j;
+ }
+}
diff --git a/flang-rt/unittests/Runtime/NumericalFormatTest.cpp b/flang-rt/unittests/Runtime/NumericalFormatTest.cpp
index 73245dc..4e5fdcc 100644
--- a/flang-rt/unittests/Runtime/NumericalFormatTest.cpp
+++ b/flang-rt/unittests/Runtime/NumericalFormatTest.cpp
@@ -921,6 +921,7 @@ TEST(IOApiTests, EditDoubleInputValues) {
{"(BZ,F18.0)", " . ", 0x0, 0},
{"(BZ,F18.0)", " . e +1 ", 0x0, 0},
{"(DC,F18.0)", " 12,5", 0x4029000000000000, 0},
+ {"(DC,F18.0)", " 12,5;", 0x4029000000000000, 0},
{"(EX22.0)", "0X0P0 ", 0x0, 0}, // +0.
{"(EX22.0)", "-0X0P0 ", 0x8000000000000000, 0}, // -0.
{"(EX22.0)", "0X.8P1 ", 0x3ff0000000000000, 0}, // 1.0
@@ -964,6 +965,7 @@ TEST(IOApiTests, EditDoubleInputValues) {
{"(RU,E9.1)", " 1.0E-325", 0x1, 0},
{"(E9.1)", "-1.0E-325", 0x8000000000000000, 0},
{"(RD,E9.1)", "-1.0E-325", 0x8000000000000001, 0},
+ {"(F7.0))", "+NaN(q)", 0x7ff8000000000000, 0},
};
for (auto const &[format, data, want, iostat] : testCases) {
auto cookie{IONAME(BeginInternalFormattedInput)(