1// © 2016 and later: Unicode, Inc. and others. 2// License & terms of use: http://www.unicode.org/copyright.html 3/* 4******************************************************************************* 5* Copyright (C) 2014, International Business Machines Corporation and * 6* others. All Rights Reserved. * 7******************************************************************************* 8* 9* File SCINUMBERFORMATTERTEST.CPP 10* 11******************************************************************************* 12*/ 13#include "unicode/utypes.h" 14 15#include "intltest.h" 16 17#if !UCONFIG_NO_FORMATTING 18 19#include "unicode/scientificnumberformatter.h" 20#include "unicode/numfmt.h" 21#include "unicode/decimfmt.h" 22#include "unicode/localpointer.h" 23 24class ScientificNumberFormatterTest : public IntlTest { 25public: 26 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0); 27private: 28 void TestBasic(); 29 void TestFarsi(); 30 void TestPlusSignInExponentMarkup(); 31 void TestPlusSignInExponentSuperscript(); 32 void TestFixedDecimalMarkup(); 33 void TestFixedDecimalSuperscript(); 34}; 35 36void ScientificNumberFormatterTest::runIndexedTest( 37 int32_t index, UBool exec, const char *&name, char *) { 38 if (exec) { 39 logln("TestSuite ScientificNumberFormatterTest: "); 40 } 41 TESTCASE_AUTO_BEGIN; 42 TESTCASE_AUTO(TestBasic); 43 TESTCASE_AUTO(TestFarsi); 44 TESTCASE_AUTO(TestPlusSignInExponentMarkup); 45 TESTCASE_AUTO(TestPlusSignInExponentSuperscript); 46 TESTCASE_AUTO(TestFixedDecimalMarkup); 47 TESTCASE_AUTO(TestFixedDecimalSuperscript); 48 TESTCASE_AUTO_END; 49} 50 51void ScientificNumberFormatterTest::TestBasic() { 52 UErrorCode status = U_ZERO_ERROR; 53 UnicodeString prefix("String: "); 54 UnicodeString appendTo(prefix); 55 LocalPointer<ScientificNumberFormatter> fmt( 56 ScientificNumberFormatter::createMarkupInstance( 57 "en" , "<sup>", "</sup>", status)); 58 if (!assertSuccess("Can't create ScientificNumberFormatter", status)) { 59 return; 60 } 61 fmt->format(1.23456e-78, appendTo, status); 62 const char *expected = "String: 1.23456\\u00d710<sup>-78</sup>"; 63 assertEquals( 64 "markup style", 65 UnicodeString(expected).unescape(), 66 appendTo); 67 68 // Test superscript style 69 fmt.adoptInstead( 70 ScientificNumberFormatter::createSuperscriptInstance( 71 "en", status)); 72 if (!assertSuccess("Can't create ScientificNumberFormatter2", status)) { 73 return; 74 } 75 appendTo = prefix; 76 fmt->format(1.23456e-78, appendTo, status); 77 expected = "String: 1.23456\\u00d710\\u207b\\u2077\\u2078"; 78 assertEquals( 79 "superscript style", 80 UnicodeString(expected).unescape(), 81 appendTo); 82 83 // Test clone 84 LocalPointer<ScientificNumberFormatter> fmt3(fmt->clone()); 85 if (fmt3.isNull()) { 86 errln("Allocating clone failed."); 87 return; 88 } 89 appendTo = prefix; 90 fmt3->format(1.23456e-78, appendTo, status); 91 expected = "String: 1.23456\\u00d710\\u207b\\u2077\\u2078"; 92 assertEquals( 93 "superscript style", 94 UnicodeString(expected).unescape(), 95 appendTo); 96 assertSuccess("", status); 97} 98 99void ScientificNumberFormatterTest::TestFarsi() { 100 UErrorCode status = U_ZERO_ERROR; 101 UnicodeString prefix("String: "); 102 UnicodeString appendTo(prefix); 103 LocalPointer<ScientificNumberFormatter> fmt( 104 ScientificNumberFormatter::createMarkupInstance( 105 "fa", "<sup>", "</sup>", status)); 106 if (!assertSuccess("Can't create ScientificNumberFormatter", status)) { 107 return; 108 } 109 fmt->format(1.23456e-78, appendTo, status); 110 const char *expected = "String: \\u06F1\\u066B\\u06F2\\u06F3\\u06F4\\u06F5\\u06F6\\u00d7\\u06F1\\u06F0<sup>\\u200E\\u2212\\u06F7\\u06F8</sup>"; 111 assertEquals( 112 "", 113 UnicodeString(expected).unescape(), 114 appendTo); 115 assertSuccess("", status); 116} 117 118void ScientificNumberFormatterTest::TestPlusSignInExponentMarkup() { 119 UErrorCode status = U_ZERO_ERROR; 120 LocalPointer<DecimalFormat> decfmt((DecimalFormat *) NumberFormat::createScientificInstance("en", status)); 121 if (U_FAILURE(status)) { 122 dataerrln("Failed call NumberFormat::createScientificInstance(\"en\", status) - %s", u_errorName(status)); 123 return; 124 } 125 decfmt->applyPattern("0.00E+0", status); 126 if (!assertSuccess("", status)) { 127 return; 128 } 129 UnicodeString appendTo; 130 LocalPointer<ScientificNumberFormatter> fmt( 131 ScientificNumberFormatter::createMarkupInstance( 132 new DecimalFormat(*decfmt), "<sup>", "</sup>", status)); 133 if (!assertSuccess("Can't create ScientificNumberFormatter", status)) { 134 return; 135 } 136 fmt->format(6.02e23, appendTo, status); 137 const char *expected = "6.02\\u00d710<sup>+23</sup>"; 138 assertEquals( 139 "", 140 UnicodeString(expected).unescape(), 141 appendTo); 142 assertSuccess("", status); 143} 144 145void ScientificNumberFormatterTest::TestPlusSignInExponentSuperscript() { 146 UErrorCode status = U_ZERO_ERROR; 147 LocalPointer<DecimalFormat> decfmt((DecimalFormat *) NumberFormat::createScientificInstance("en", status)); 148 if (U_FAILURE(status)) { 149 dataerrln("Failed call NumberFormat::createScientificInstance(\"en\", status) - %s", u_errorName(status)); 150 return; 151 } 152 decfmt->applyPattern("0.00E+0", status); 153 if (!assertSuccess("", status)) { 154 return; 155 } 156 UnicodeString appendTo; 157 LocalPointer<ScientificNumberFormatter> fmt( 158 ScientificNumberFormatter::createSuperscriptInstance( 159 new DecimalFormat(*decfmt), status)); 160 if (!assertSuccess("Can't create ScientificNumberFormatter", status)) { 161 return; 162 } 163 fmt->format(6.02e23, appendTo, status); 164 const char *expected = "6.02\\u00d710\\u207a\\u00b2\\u00b3"; 165 assertEquals( 166 "", 167 UnicodeString(expected).unescape(), 168 appendTo); 169 assertSuccess("", status); 170} 171 172void ScientificNumberFormatterTest::TestFixedDecimalMarkup() { 173 UErrorCode status = U_ZERO_ERROR; 174 LocalPointer<DecimalFormat> decfmt((DecimalFormat *) NumberFormat::createInstance("en", status)); 175 if (assertSuccess("NumberFormat::createInstance", status, TRUE) == FALSE) { 176 return; 177 } 178 LocalPointer<ScientificNumberFormatter> fmt( 179 ScientificNumberFormatter::createMarkupInstance( 180 new DecimalFormat(*decfmt), "<sup>", "</sup>", status)); 181 if (!assertSuccess("Can't create ScientificNumberFormatter", status)) { 182 return; 183 } 184 UnicodeString appendTo; 185 fmt->format(123456.0, appendTo, status); 186 const char *expected = "123,456"; 187 assertEquals( 188 "", 189 UnicodeString(expected).unescape(), 190 appendTo); 191 assertSuccess("", status); 192} 193 194void ScientificNumberFormatterTest::TestFixedDecimalSuperscript() { 195 UErrorCode status = U_ZERO_ERROR; 196 LocalPointer<DecimalFormat> decfmt((DecimalFormat *) NumberFormat::createInstance("en", status)); 197 if (assertSuccess("NumberFormat::createInstance", status, TRUE) == FALSE) { 198 return; 199 } 200 LocalPointer<ScientificNumberFormatter> fmt( 201 ScientificNumberFormatter::createSuperscriptInstance( 202 new DecimalFormat(*decfmt), status)); 203 if (!assertSuccess("Can't create ScientificNumberFormatter", status)) { 204 return; 205 } 206 UnicodeString appendTo; 207 fmt->format(123456.0, appendTo, status); 208 const char *expected = "123,456"; 209 assertEquals( 210 "", 211 UnicodeString(expected).unescape(), 212 appendTo); 213 assertSuccess("", status); 214} 215 216extern IntlTest *createScientificNumberFormatterTest() { 217 return new ScientificNumberFormatterTest(); 218} 219 220#endif /* !UCONFIG_NO_FORMATTING */ 221