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