mirror of https://github.com/odrling/Aegisub
Fixed athenatime's parse and updated test cases.
Originally committed to SVN as r2446.
This commit is contained in:
parent
c029e5aac8
commit
c242064d36
|
@ -132,11 +132,13 @@ void Time::ParseString(const String &data)
|
||||||
{
|
{
|
||||||
// Break into an array of values
|
// Break into an array of values
|
||||||
array<size_t,4> values;
|
array<size_t,4> values;
|
||||||
size_t last = 0;
|
//size_t last = 0;
|
||||||
size_t len = data.Length();
|
size_t len = data.Length();
|
||||||
size_t curIndex = 0;
|
size_t curIndex = 0;
|
||||||
char cur = 0;
|
char cur = 0;
|
||||||
bool gotDecimal = false;
|
bool gotDecimal = false;
|
||||||
|
int curValue = 0;
|
||||||
|
int nDigits = 0;
|
||||||
for (size_t i=0;i<len;i++) {
|
for (size_t i=0;i<len;i++) {
|
||||||
cur = data[i];
|
cur = data[i];
|
||||||
|
|
||||||
|
@ -147,26 +149,36 @@ void Time::ParseString(const String &data)
|
||||||
if (gotDecimal) break;
|
if (gotDecimal) break;
|
||||||
gotDecimal = true;
|
gotDecimal = true;
|
||||||
}
|
}
|
||||||
values.at(curIndex++) = data.SubToInteger(last,i);
|
//values.at(curIndex++) = data.SubToInteger(last,i);
|
||||||
last = i+1;
|
//last = i+1;
|
||||||
|
values.at(curIndex++) = curValue;
|
||||||
|
curValue = 0;
|
||||||
|
nDigits = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Got a digit
|
||||||
|
else {
|
||||||
|
curValue = curValue * 10 + (int)(cur-'0');
|
||||||
|
nDigits++;
|
||||||
|
|
||||||
|
// Check if we're already done
|
||||||
|
if (gotDecimal && nDigits >= 3) {
|
||||||
|
values.at(curIndex++) = curValue;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reached end of string
|
// Reached end of string
|
||||||
if (i == len-1) {
|
if (i == len-1) {
|
||||||
int value = data.SubToInteger(last,len);
|
//int value = data.SubToInteger(last,len);
|
||||||
size_t digits = len - last;
|
//size_t digits = len - last;
|
||||||
|
|
||||||
// Ended in decimal, so we gotta normalize it to 3 digits
|
// Ended in decimal, so we gotta normalize it to 3 digits
|
||||||
if (gotDecimal) {
|
if (gotDecimal) {
|
||||||
if (digits != 3) {
|
if (nDigits == 2) curValue *= 10;
|
||||||
if (digits == 2) value *= 10;
|
else if (nDigits == 1) curValue *= 100;
|
||||||
else if (digits == 1) value *= 100;
|
|
||||||
else if (digits > 3) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
values.at(curIndex++) = value;
|
values.at(curIndex++) = curValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "../suites.h"
|
#include "../suites.h"
|
||||||
#if ATHENASUB_TEST == 1
|
#if ATHENASUB_TEST == 1
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
#include <cppunit/TestFixture.h>
|
#include <cppunit/TestFixture.h>
|
||||||
#include <cppunit/extensions/HelperMacros.h>
|
#include <cppunit/extensions/HelperMacros.h>
|
||||||
#include "../../../athenasub/include/athenasub/athenasub.h"
|
#include "../../../athenasub/include/athenasub/athenasub.h"
|
||||||
|
@ -48,6 +49,7 @@ class AthenasubTimeTest : public CppUnit::TestFixture {
|
||||||
CPPUNIT_TEST(testComparison);
|
CPPUNIT_TEST(testComparison);
|
||||||
CPPUNIT_TEST(testOperators);
|
CPPUNIT_TEST(testOperators);
|
||||||
CPPUNIT_TEST(testSetGet);
|
CPPUNIT_TEST(testSetGet);
|
||||||
|
CPPUNIT_TEST(testParse);
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -104,6 +106,49 @@ public:
|
||||||
CPPUNIT_ASSERT(a - 300 == Time(200));
|
CPPUNIT_ASSERT(a - 300 == Time(200));
|
||||||
CPPUNIT_ASSERT(a - 600 == Time(0));
|
CPPUNIT_ASSERT(a - 600 == Time(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void testParse()
|
||||||
|
{
|
||||||
|
Time a;
|
||||||
|
a.ParseString("0");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 0);
|
||||||
|
a.ParseString("5");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 5000);
|
||||||
|
a.ParseString("5.0");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 5000);
|
||||||
|
a.ParseString("5,0");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 5000);
|
||||||
|
a.ParseString("5.00");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 5000);
|
||||||
|
a.ParseString("5.000");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 5000);
|
||||||
|
a.ParseString("5.1");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 5100);
|
||||||
|
a.ParseString("5.12");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 5120);
|
||||||
|
a.ParseString("5.123");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 5123);
|
||||||
|
a.ParseString("5,123");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 5123);
|
||||||
|
a.ParseString("5,1234");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 5123);
|
||||||
|
a.ParseString("5,");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 5000);
|
||||||
|
a.ParseString("05.12");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 5120);
|
||||||
|
a.ParseString("0:05.12");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 5120);
|
||||||
|
a.ParseString("0:15.12");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 15120);
|
||||||
|
a.ParseString("1:15.12");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 75120);
|
||||||
|
a.ParseString("11:15.12");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 675120);
|
||||||
|
a.ParseString("2:11:15.12");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 675120+7200000);
|
||||||
|
a.ParseString("10:11:15.12");
|
||||||
|
CPPUNIT_ASSERT(a.GetMS() == 675120+36000000);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(AthenasubTimeTest,AegisubSuites::athenasub());
|
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(AthenasubTimeTest,AegisubSuites::athenasub());
|
||||||
|
|
|
@ -40,8 +40,12 @@
|
||||||
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
#ifdef _DEBUG
|
||||||
|
#pragma comment(lib,"cppunitd.lib")
|
||||||
|
#else
|
||||||
#pragma comment(lib,"cppunit.lib")
|
#pragma comment(lib,"cppunit.lib")
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
|
|
Loading…
Reference in New Issue