Skip to content

Commit 7b89562

Browse files
committed
#60: more tests for non-standard locales
1 parent 98265a5 commit 7b89562

File tree

3 files changed

+104
-0
lines changed

3 files changed

+104
-0
lines changed

include/decimal.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ typedef xdouble cross_float;
172172
// ----------------------------------------------------------------------------
173173
// Forward class definitions
174174
// ----------------------------------------------------------------------------
175+
class basic_decimal_format;
175176

176177
// ----------------------------------------------------------------------------
177178
// Constants
@@ -723,6 +724,10 @@ class decimal {
723724
fromString(value, *this);
724725
}
725726

727+
explicit decimal(const std::string &value, const basic_decimal_format &format) {
728+
fromString(value, format, *this);
729+
}
730+
726731
#ifdef DEC_NO_CPP11
727732
~decimal() {
728733
}

tests/decimalTestString.cpp

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,4 +108,93 @@ BOOST_AUTO_TEST_CASE(decimalItalianoParsing) {
108108
ret.unpack(beforeValue, afterValue);
109109
BOOST_CHECK_EQUAL(beforeValue, 1234);
110110
BOOST_CHECK_EQUAL(afterValue, 56);
111+
}
112+
113+
BOOST_AUTO_TEST_CASE(decimalToStringWithGlobalCLocale) {
114+
std::locale prior_cout_locale = std::cout.getloc();
115+
std::locale prior_locale = std::locale::global(std::locale("C"));
116+
117+
dec::decimal<7> value = dec::decimal<7>::buildWithExponent(1234567890987L, -7);
118+
std::string expected = "123456.7890987";
119+
120+
BOOST_CHECK_EQUAL(dec::toString(value), expected);
121+
122+
std::cout.imbue( prior_cout_locale );
123+
std::locale::global(prior_locale);
124+
}
125+
126+
BOOST_AUTO_TEST_CASE(decimalToStringWithGlobalItLocale) {
127+
std::locale prior_cout_locale = std::cout.getloc();
128+
std::locale italiano_locale(std::cout.getloc(), new italiano_separators);
129+
std::locale prior_locale = std::locale::global(italiano_locale);
130+
131+
dec::decimal<7> value = dec::decimal<7>::buildWithExponent(1234567890987L, -7);
132+
std::string expected = "123.456,7890987";
133+
134+
BOOST_CHECK_EQUAL(dec::toString(value), expected);
135+
136+
std::cout.imbue(prior_cout_locale);
137+
std::locale::global(prior_locale);
138+
}
139+
140+
BOOST_AUTO_TEST_CASE(decimalToStringWithGlobalItLocaleAndProvidedFormat) {
141+
std::locale prior_cout_locale = std::cout.getloc();
142+
std::locale italiano_locale(std::cout.getloc(), new italiano_separators);
143+
std::locale prior_locale = std::locale::global(italiano_locale);
144+
145+
dec::decimal_format format('.', '\0');
146+
147+
dec::decimal<7> value = dec::decimal<7>::buildWithExponent(1234567890987L, -7);
148+
std::string expected = "123456.7890987";
149+
150+
BOOST_CHECK_EQUAL(dec::toString(value, format), expected);
151+
152+
std::cout.imbue(prior_cout_locale);
153+
std::locale::global(prior_locale);
154+
}
155+
156+
BOOST_AUTO_TEST_CASE(decimalFromStringWithGlobalCLocale) {
157+
std::locale prior_cout_locale = std::cout.getloc();
158+
std::locale prior_locale = std::locale::global(std::locale("C"));
159+
160+
std::string value = "123456.7890987";
161+
dec::decimal<7> expected = dec::decimal<7>::buildWithExponent(1234567890987L, -7);
162+
dec::decimal<7> d7(value);
163+
164+
BOOST_CHECK_EQUAL(d7, expected);
165+
166+
std::cout.imbue(prior_cout_locale);
167+
std::locale::global(prior_locale);
168+
}
169+
170+
BOOST_AUTO_TEST_CASE(decimalFromStringWithGlobalItLocale) {
171+
std::locale prior_cout_locale = std::cout.getloc();
172+
std::locale italiano_locale(std::cout.getloc(), new italiano_separators);
173+
std::locale prior_locale = std::locale::global(italiano_locale);
174+
175+
std::string value = "123.456,7890987";
176+
dec::decimal<7> expected = dec::decimal<7>::buildWithExponent(1234567890987L, -7);
177+
dec::decimal<7> d7(value);
178+
179+
BOOST_CHECK_EQUAL(d7, expected);
180+
181+
std::cout.imbue(prior_cout_locale);
182+
std::locale::global(prior_locale);
183+
}
184+
185+
BOOST_AUTO_TEST_CASE(decimalFromStringWithGlobalItLocaleAndProvidedFormat) {
186+
std::locale prior_cout_locale = std::cout.getloc();
187+
std::locale italiano_locale(std::cout.getloc(), new italiano_separators);
188+
std::locale prior_locale = std::locale::global(italiano_locale);
189+
190+
dec::decimal_format cformat('.', '\0');
191+
192+
std::string value = "123456.7890987";
193+
dec::decimal<7> expected = dec::decimal<7>::buildWithExponent(1234567890987L, -7);
194+
dec::decimal<7> d7(value, cformat);
195+
196+
BOOST_CHECK_EQUAL(d7, expected);
197+
198+
std::cout.imbue(prior_cout_locale);
199+
std::locale::global(prior_locale);
111200
}

tests/decimalTestWithExponent.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,15 @@
4444
BOOST_CHECK_EQUAL(dec::decimal<4>::buildWithExponent(temp, 111215, -5), dec::decimal<4>("1.1122"));
4545
BOOST_CHECK_EQUAL(dec::decimal<4>::buildWithExponent(temp, -111213, -5), dec::decimal<4>("-1.1121"));
4646
BOOST_CHECK_EQUAL(dec::decimal<4>::buildWithExponent(temp, -111215, -5), dec::decimal<4>("-1.1122"));
47+
48+
// check overflow
49+
BOOST_CHECK_EQUAL(dec::decimal<0>::buildWithExponent(1, 23), dec::decimal<0>("0"));
50+
BOOST_CHECK_EQUAL(dec::decimal<4>::buildWithExponent(1, 23), dec::decimal<4>("0"));
51+
BOOST_CHECK_EQUAL(dec::decimal<4>::buildWithExponent(1, 19), dec::decimal<4>("0"));
52+
BOOST_CHECK_EQUAL(dec::decimal<4>::buildWithExponent(1, 15), dec::decimal<4>("0"));
53+
54+
// check underflow
55+
BOOST_CHECK_EQUAL(dec::decimal<4>::buildWithExponent(1, -19), dec::decimal<4>("0"));
56+
BOOST_CHECK_EQUAL(dec::decimal<4>::buildWithExponent(1, -15), dec::decimal<4>("0"));
4757
}
4858

0 commit comments

Comments
 (0)