// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2014, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * * File SCINUMBERFORMATTERTEST.CPP * ******************************************************************************* */ #include "unicode/utypes.h" #include "intltest.h" #if !UCONFIG_NO_FORMATTING #include "unicode/scientificnumberformatter.h" #include "unicode/numfmt.h" #include "unicode/decimfmt.h" #include "unicode/localpointer.h" class ScientificNumberFormatterTest : public IntlTest { public: void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0); private: void TestBasic(); void TestFarsi(); void TestPlusSignInExponentMarkup(); void TestPlusSignInExponentSuperscript(); void TestFixedDecimalMarkup(); void TestFixedDecimalSuperscript(); }; void ScientificNumberFormatterTest::runIndexedTest( int32_t index, UBool exec, const char *&name, char *) { if (exec) { logln("TestSuite ScientificNumberFormatterTest: "); } TESTCASE_AUTO_BEGIN; TESTCASE_AUTO(TestBasic); TESTCASE_AUTO(TestFarsi); TESTCASE_AUTO(TestPlusSignInExponentMarkup); TESTCASE_AUTO(TestPlusSignInExponentSuperscript); TESTCASE_AUTO(TestFixedDecimalMarkup); TESTCASE_AUTO(TestFixedDecimalSuperscript); TESTCASE_AUTO_END; } void ScientificNumberFormatterTest::TestBasic() { UErrorCode status = U_ZERO_ERROR; UnicodeString prefix("String: "); UnicodeString appendTo(prefix); LocalPointer fmt( ScientificNumberFormatter::createMarkupInstance( "en" , "", "", status)); if (!assertSuccess("Can't create ScientificNumberFormatter", status)) { return; } fmt->format(1.23456e-78, appendTo, status); const char *expected = "String: 1.23456\\u00d710-78"; assertEquals( "markup style", UnicodeString(expected).unescape(), appendTo); // Test superscript style fmt.adoptInstead( ScientificNumberFormatter::createSuperscriptInstance( "en", status)); if (!assertSuccess("Can't create ScientificNumberFormatter2", status)) { return; } appendTo = prefix; fmt->format(1.23456e-78, appendTo, status); expected = "String: 1.23456\\u00d710\\u207b\\u2077\\u2078"; assertEquals( "superscript style", UnicodeString(expected).unescape(), appendTo); // Test clone LocalPointer fmt3(fmt->clone()); if (fmt3.isNull()) { errln("Allocating clone failed."); return; } appendTo = prefix; fmt3->format(1.23456e-78, appendTo, status); expected = "String: 1.23456\\u00d710\\u207b\\u2077\\u2078"; assertEquals( "superscript style", UnicodeString(expected).unescape(), appendTo); assertSuccess("", status); } void ScientificNumberFormatterTest::TestFarsi() { UErrorCode status = U_ZERO_ERROR; UnicodeString prefix("String: "); UnicodeString appendTo(prefix); LocalPointer fmt( ScientificNumberFormatter::createMarkupInstance( "fa", "", "", status)); if (!assertSuccess("Can't create ScientificNumberFormatter", status)) { return; } fmt->format(1.23456e-78, appendTo, status); const char *expected = "String: \\u06F1\\u066B\\u06F2\\u06F3\\u06F4\\u06F5\\u06F6\\u00d7\\u06F1\\u06F0\\u200E\\u2212\\u06F7\\u06F8"; assertEquals( "", UnicodeString(expected).unescape(), appendTo); assertSuccess("", status); } void ScientificNumberFormatterTest::TestPlusSignInExponentMarkup() { UErrorCode status = U_ZERO_ERROR; LocalPointer decfmt((DecimalFormat *) NumberFormat::createScientificInstance("en", status)); if (U_FAILURE(status)) { dataerrln("Failed call NumberFormat::createScientificInstance(\"en\", status) - %s", u_errorName(status)); return; } decfmt->applyPattern("0.00E+0", status); if (!assertSuccess("", status)) { return; } UnicodeString appendTo; LocalPointer fmt( ScientificNumberFormatter::createMarkupInstance( new DecimalFormat(*decfmt), "", "", status)); if (!assertSuccess("Can't create ScientificNumberFormatter", status)) { return; } fmt->format(6.02e23, appendTo, status); const char *expected = "6.02\\u00d710+23"; assertEquals( "", UnicodeString(expected).unescape(), appendTo); assertSuccess("", status); } void ScientificNumberFormatterTest::TestPlusSignInExponentSuperscript() { UErrorCode status = U_ZERO_ERROR; LocalPointer decfmt((DecimalFormat *) NumberFormat::createScientificInstance("en", status)); if (U_FAILURE(status)) { dataerrln("Failed call NumberFormat::createScientificInstance(\"en\", status) - %s", u_errorName(status)); return; } decfmt->applyPattern("0.00E+0", status); if (!assertSuccess("", status)) { return; } UnicodeString appendTo; LocalPointer fmt( ScientificNumberFormatter::createSuperscriptInstance( new DecimalFormat(*decfmt), status)); if (!assertSuccess("Can't create ScientificNumberFormatter", status)) { return; } fmt->format(6.02e23, appendTo, status); const char *expected = "6.02\\u00d710\\u207a\\u00b2\\u00b3"; assertEquals( "", UnicodeString(expected).unescape(), appendTo); assertSuccess("", status); } void ScientificNumberFormatterTest::TestFixedDecimalMarkup() { UErrorCode status = U_ZERO_ERROR; LocalPointer decfmt((DecimalFormat *) NumberFormat::createInstance("en", status)); if (assertSuccess("NumberFormat::createInstance", status, TRUE) == FALSE) { return; } LocalPointer fmt( ScientificNumberFormatter::createMarkupInstance( new DecimalFormat(*decfmt), "", "", status)); if (!assertSuccess("Can't create ScientificNumberFormatter", status)) { return; } UnicodeString appendTo; fmt->format(123456.0, appendTo, status); const char *expected = "123,456"; assertEquals( "", UnicodeString(expected).unescape(), appendTo); assertSuccess("", status); } void ScientificNumberFormatterTest::TestFixedDecimalSuperscript() { UErrorCode status = U_ZERO_ERROR; LocalPointer decfmt((DecimalFormat *) NumberFormat::createInstance("en", status)); if (assertSuccess("NumberFormat::createInstance", status, TRUE) == FALSE) { return; } LocalPointer fmt( ScientificNumberFormatter::createSuperscriptInstance( new DecimalFormat(*decfmt), status)); if (!assertSuccess("Can't create ScientificNumberFormatter", status)) { return; } UnicodeString appendTo; fmt->format(123456.0, appendTo, status); const char *expected = "123,456"; assertEquals( "", UnicodeString(expected).unescape(), appendTo); assertSuccess("", status); } extern IntlTest *createScientificNumberFormatterTest() { return new ScientificNumberFormatterTest(); } #endif /* !UCONFIG_NO_FORMATTING */