mkvtoolnix/tests/unit/common/strings_parsing.cpp
2016-11-21 20:15:52 +01:00

370 lines
12 KiB
C++

#include "common/common_pch.h"
#include "common/math.h"
#include "common/strings/editing.h"
#include "common/strings/parsing.h"
#include "gtest/gtest.h"
namespace {
TEST(StringsParsing, ParseDurationNumberWithUnitSecondUnitsIntegers) {
int64_t value;
EXPECT_TRUE(parse_duration_number_with_unit("12345ns", value));
EXPECT_EQ(12345ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("12345nsec", value));
EXPECT_EQ(12345ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("12345us", value));
EXPECT_EQ(12345000ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("12345µs", value));
EXPECT_EQ(12345000ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("12345ms", value));
EXPECT_EQ(12345000000ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("12345msec", value));
EXPECT_EQ(12345000000ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("12345s", value));
EXPECT_EQ(12345000000000ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("123m", value));
EXPECT_EQ(7380000000000ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("123min", value));
EXPECT_EQ(7380000000000ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("12h", value));
EXPECT_EQ(43200000000000ll, value);
}
TEST(StringsParsing, ParseDurationNumberWithUnitSecondUnitsFloats) {
int64_t value;
EXPECT_TRUE(parse_duration_number_with_unit("12345.678ns", value));
EXPECT_EQ(12345ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("12345.678nsec", value));
EXPECT_EQ(12345ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("12345.678us", value));
EXPECT_EQ(12345678ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("12345.678µs", value));
EXPECT_EQ(12345678ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("12345.678ms", value));
EXPECT_EQ(12345678000ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("12345.678msec", value));
EXPECT_EQ(12345678000ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("12345.678s", value));
EXPECT_EQ(12345678000000ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("12345.678m", value));
EXPECT_EQ(740740680000000, value);
EXPECT_TRUE(parse_duration_number_with_unit("12345.678min", value));
EXPECT_EQ(740740680000000, value);
EXPECT_TRUE(parse_duration_number_with_unit("12345.678h", value));
EXPECT_EQ(44444440800000000ll, value);
}
TEST(StringsParsing, ParseDurationNumberWithUnitSecondUnitsFractions) {
int64_t value;
EXPECT_TRUE(parse_duration_number_with_unit("2500/50ns", value));
EXPECT_EQ(50ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("2500/50nsec", value));
EXPECT_EQ(50ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("2500/50us", value));
EXPECT_EQ(50000ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("2500/50µs", value));
EXPECT_EQ(50000ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("2500/50ms", value));
EXPECT_EQ(50000000ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("2500/50msec", value));
EXPECT_EQ(50000000ll, value);
EXPECT_TRUE(parse_duration_number_with_unit("2500/50ns", value));
EXPECT_EQ(50, value);
EXPECT_TRUE(parse_duration_number_with_unit("2500/50nsec", value));
EXPECT_EQ(50, value);
}
TEST(StringsParsing, ParseDurationNumberWithUnitFrameUnitsIntegers) {
int64_t value;
EXPECT_TRUE(parse_duration_number_with_unit("20fps", value));
EXPECT_EQ(1000000000ll / 20, value);
EXPECT_TRUE(parse_duration_number_with_unit("20p", value));
EXPECT_EQ(1000000000ll / 20, value);
EXPECT_TRUE(parse_duration_number_with_unit("20i", value));
EXPECT_EQ(1000000000ll / 10, value);
}
TEST(StringsParsing, ParseDurationNumberWithUnitFrameUnitsSpecialValues) {
int64_t value;
EXPECT_TRUE(parse_duration_number_with_unit("23.96fps", value));
EXPECT_EQ(1000000000ll * 1001 / 24000, value);
EXPECT_TRUE(parse_duration_number_with_unit("29.976fps", value));
EXPECT_EQ(1000000000ll * 1001 / 30000, value);
EXPECT_TRUE(parse_duration_number_with_unit("59.94fps", value));
EXPECT_EQ(1000000000ll * 1001 / 60000, value);
}
TEST(StringsParsing, ParseDurationNumberWithUnitInvalid) {
int64_t value;
EXPECT_FALSE(parse_duration_number_with_unit("", value));
EXPECT_FALSE(parse_duration_number_with_unit("20", value));
EXPECT_FALSE(parse_duration_number_with_unit("fps", value));
EXPECT_FALSE(parse_duration_number_with_unit("i", value));
EXPECT_FALSE(parse_duration_number_with_unit("i20", value));
EXPECT_FALSE(parse_duration_number_with_unit("20/s", value));
}
TEST(StringsParsing, ParseNumberToRationalInvalidPatterns) {
int64_rational_c r;
EXPECT_FALSE(parse_number("", r));
EXPECT_FALSE(parse_number("bad", r));
EXPECT_FALSE(parse_number("123.bad", r));
}
TEST(StringsParsing, ParseNumberToRationalValidPatterns) {
int64_rational_c r;
EXPECT_TRUE(parse_number("0", r));
EXPECT_EQ(int64_rational_c(0ll, 1ll), r);
EXPECT_TRUE(parse_number("0.0", r));
EXPECT_EQ(int64_rational_c(0ll, 1ll), r);
EXPECT_TRUE(parse_number("1", r));
EXPECT_EQ(int64_rational_c(1ll, 1ll), r);
EXPECT_TRUE(parse_number("1.", r));
EXPECT_EQ(int64_rational_c(1ll, 1ll), r);
EXPECT_TRUE(parse_number("1.0", r));
EXPECT_EQ(int64_rational_c(1ll, 1ll), r);
EXPECT_TRUE(parse_number("123456.789", r));
EXPECT_EQ(int64_rational_c(123456789ll, 1000ll), r);
EXPECT_TRUE(parse_number("123456.789", r));
EXPECT_EQ(int64_rational_c(123456789ll, 1000ll), r);
EXPECT_TRUE(parse_number("123456.789012345", r));
EXPECT_EQ(int64_rational_c(123456789012345ll, 1000000000ll), r);
}
TEST(StringParsing, ParseTimecodeValidPatternsNumberWithUnit) {
int64_t timecode;
EXPECT_TRUE(parse_timecode("123h", timecode, true));
EXPECT_EQ(442800000000000ll, timecode);
EXPECT_TRUE(parse_timecode("123m", timecode, true));
EXPECT_EQ(7380000000000ll, timecode);
EXPECT_TRUE(parse_timecode("123min", timecode, true));
EXPECT_EQ(7380000000000ll, timecode);
EXPECT_TRUE(parse_timecode("123ms", timecode, true));
EXPECT_EQ(123000000ll, timecode);
EXPECT_TRUE(parse_timecode("123msec", timecode, true));
EXPECT_EQ(123000000ll, timecode);
EXPECT_TRUE(parse_timecode("123us", timecode, true));
EXPECT_EQ(123000ll, timecode);
EXPECT_TRUE(parse_timecode("123µs", timecode, true));
EXPECT_EQ(123000ll, timecode);
EXPECT_TRUE(parse_timecode("123ns", timecode, true));
EXPECT_EQ(123, timecode);
EXPECT_TRUE(parse_timecode("123nsec", timecode, true));
EXPECT_EQ(123, timecode);
}
TEST(StringParsing, ParseTimecodeValidPatternsNumberWithUnitNegative) {
int64_t timecode;
EXPECT_TRUE(parse_timecode("-123h", timecode, true));
EXPECT_EQ(-442800000000000ll, timecode);
EXPECT_TRUE(parse_timecode("-123m", timecode, true));
EXPECT_EQ(-7380000000000ll, timecode);
EXPECT_TRUE(parse_timecode("-123min", timecode, true));
EXPECT_EQ(-7380000000000ll, timecode);
EXPECT_TRUE(parse_timecode("-123s", timecode, true));
EXPECT_EQ(-123000000000ll, timecode);
EXPECT_TRUE(parse_timecode("-123ms", timecode, true));
EXPECT_EQ(-123000000ll, timecode);
EXPECT_TRUE(parse_timecode("-123msec", timecode, true));
EXPECT_EQ(-123000000ll, timecode);
EXPECT_TRUE(parse_timecode("-123us", timecode, true));
EXPECT_EQ(-123000ll, timecode);
EXPECT_TRUE(parse_timecode("-123µs", timecode, true));
EXPECT_EQ(-123000ll, timecode);
EXPECT_TRUE(parse_timecode("-123ns", timecode, true));
EXPECT_EQ(-123, timecode);
EXPECT_TRUE(parse_timecode("-123ns", timecode, true));
EXPECT_EQ(-123, timecode);
EXPECT_TRUE(parse_timecode("-123nsec", timecode, true));
EXPECT_EQ(-123, timecode);
}
TEST(StringParsing, ParseTimecodeValidPatternsHMSns) {
int64_t timecode;
EXPECT_TRUE(parse_timecode("12:34:56.789123456", timecode, true));
EXPECT_EQ(45296789123456ll, timecode);
EXPECT_TRUE(parse_timecode("2:34:56.789123456", timecode, true));
EXPECT_EQ(9296789123456ll, timecode);
EXPECT_TRUE(parse_timecode("34:56.789123456", timecode, true));
EXPECT_EQ(2096789123456ll, timecode);
EXPECT_TRUE(parse_timecode("4:56.789123456", timecode, true));
EXPECT_EQ(296789123456ll, timecode);
EXPECT_TRUE(parse_timecode("12:34:56.78912345", timecode, true));
EXPECT_EQ(45296789123450ll, timecode);
EXPECT_TRUE(parse_timecode("12:34:56.7891234", timecode, true));
EXPECT_EQ(45296789123400ll, timecode);
EXPECT_TRUE(parse_timecode("12:34:56.789123", timecode, true));
EXPECT_EQ(45296789123000ll, timecode);
EXPECT_TRUE(parse_timecode("12:34:56.78912", timecode, true));
EXPECT_EQ(45296789120000ll, timecode);
EXPECT_TRUE(parse_timecode("12:34:56.7891", timecode, true));
EXPECT_EQ(45296789100000ll, timecode);
EXPECT_TRUE(parse_timecode("12:34:56.789", timecode, true));
EXPECT_EQ(45296789000000ll, timecode);
EXPECT_TRUE(parse_timecode("12:34:56.78", timecode, true));
EXPECT_EQ(45296780000000ll, timecode);
EXPECT_TRUE(parse_timecode("12:34:56.7", timecode, true));
EXPECT_EQ(45296700000000ll, timecode);
EXPECT_TRUE(parse_timecode("12:34:56", timecode, true));
EXPECT_EQ(45296000000000ll, timecode);
EXPECT_TRUE(parse_timecode("2:34:56", timecode, true));
EXPECT_EQ(9296000000000ll, timecode);
EXPECT_TRUE(parse_timecode("34:56", timecode, true));
EXPECT_EQ(2096000000000ll, timecode);
EXPECT_TRUE(parse_timecode("4:56", timecode, true));
EXPECT_EQ(296000000000ll, timecode);
}
TEST(StringParsing, ParseTimecodeValidPatternsHMSnsNegative) {
int64_t timecode;
EXPECT_TRUE(parse_timecode("-12:34:56.789123456", timecode, true));
EXPECT_EQ(-45296789123456ll, timecode);
EXPECT_TRUE(parse_timecode("-2:34:56.789123456", timecode, true));
EXPECT_EQ(-9296789123456ll, timecode);
EXPECT_TRUE(parse_timecode("-34:56.789123456", timecode, true));
EXPECT_EQ(-2096789123456ll, timecode);
EXPECT_TRUE(parse_timecode("-4:56.789123456", timecode, true));
EXPECT_EQ(-296789123456ll, timecode);
EXPECT_TRUE(parse_timecode("-12:34:56.78912345", timecode, true));
EXPECT_EQ(-45296789123450ll, timecode);
EXPECT_TRUE(parse_timecode("-12:34:56.7891234", timecode, true));
EXPECT_EQ(-45296789123400ll, timecode);
EXPECT_TRUE(parse_timecode("-12:34:56.789123", timecode, true));
EXPECT_EQ(-45296789123000ll, timecode);
EXPECT_TRUE(parse_timecode("-12:34:56.78912", timecode, true));
EXPECT_EQ(-45296789120000ll, timecode);
EXPECT_TRUE(parse_timecode("-12:34:56.7891", timecode, true));
EXPECT_EQ(-45296789100000ll, timecode);
EXPECT_TRUE(parse_timecode("-12:34:56.789", timecode, true));
EXPECT_EQ(-45296789000000ll, timecode);
EXPECT_TRUE(parse_timecode("-12:34:56.78", timecode, true));
EXPECT_EQ(-45296780000000ll, timecode);
EXPECT_TRUE(parse_timecode("-12:34:56.7", timecode, true));
EXPECT_EQ(-45296700000000ll, timecode);
EXPECT_TRUE(parse_timecode("-12:34:56", timecode, true));
EXPECT_EQ(-45296000000000ll, timecode);
EXPECT_TRUE(parse_timecode("-2:34:56", timecode, true));
EXPECT_EQ(-9296000000000ll, timecode);
EXPECT_TRUE(parse_timecode("-34:56", timecode, true));
EXPECT_EQ(-2096000000000ll, timecode);
EXPECT_TRUE(parse_timecode("-4:56", timecode, true));
EXPECT_EQ(-296000000000ll, timecode);
}
TEST(StringParsing, ParseTimecodeInvalidPatterns) {
int64_t timecode;
EXPECT_FALSE(parse_timecode("12:34:56.789123456us", timecode, true)); // HMS: unit after
EXPECT_FALSE(parse_timecode("12:34:56.789123456qq", timecode, true)); // HMS: garbage after
EXPECT_FALSE(parse_timecode("12::56.789123456", timecode, true)); // HMS: empty minutes
EXPECT_FALSE(parse_timecode("56.789123456", timecode, true)); // HMS: no hours & minutes
EXPECT_FALSE(parse_timecode("qq56.789123456", timecode, true)); // HMS: garbage before
EXPECT_FALSE(parse_timecode("-12:34:56.789123456", timecode, false)); // HMS: negative but not allowed
EXPECT_FALSE(parse_timecode("-123s", timecode, false)); // number+unit: negative but not allowed
EXPECT_FALSE(parse_timecode("123", timecode, false)); // number+unit: no unit
EXPECT_FALSE(parse_timecode("123q", timecode, false)); // number+unit: invalid unit
EXPECT_FALSE(parse_timecode("123s q", timecode, false)); // number+unit: garbage after
EXPECT_FALSE(parse_timecode("q123s", timecode, false)); // number+unit: garbage before
}
}