16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT:
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1997-2012, International Business Machines Corporation and
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Modification History:
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdlib.h>
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/gender.h"
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unum.h"
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "intltest.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define LENGTHOF(array) (int32_t)(sizeof(array) / sizeof((array)[0]))
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UGender kSingleFemale[] = {UGENDER_FEMALE};
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UGender kSingleMale[] = {UGENDER_MALE};
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UGender kSingleOther[] = {UGENDER_OTHER};
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UGender kAllFemale[] = {UGENDER_FEMALE, UGENDER_FEMALE};
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UGender kAllMale[] = {UGENDER_MALE, UGENDER_MALE};
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UGender kAllOther[] = {UGENDER_OTHER, UGENDER_OTHER};
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UGender kFemaleMale[] = {UGENDER_FEMALE, UGENDER_MALE};
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UGender kFemaleOther[] = {UGENDER_FEMALE, UGENDER_OTHER};
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UGender kMaleOther[] = {UGENDER_MALE, UGENDER_OTHER};
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass GenderInfoTest : public IntlTest {
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GenderInfoTest() {
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0);
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void TestGetListGender();
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void TestFallback();
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void check(UGender expected_neutral, UGender expected_mixed, UGender expected_taints, const UGender* genderList, int32_t listLength);
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void checkLocale(const Locale& locale, UGender expected, const UGender* genderList, int32_t listLength);
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid GenderInfoTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char * /* par */) {
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (exec) {
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("TestSuite GenderInfoTest: ");
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  TESTCASE_AUTO_BEGIN;
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  TESTCASE_AUTO(TestGetListGender);
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  TESTCASE_AUTO(TestFallback);
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  TESTCASE_AUTO_END;
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid GenderInfoTest::TestGetListGender() {
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    check(UGENDER_OTHER, UGENDER_OTHER, UGENDER_OTHER, NULL, 0);
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    check(UGENDER_FEMALE, UGENDER_FEMALE, UGENDER_FEMALE, kSingleFemale, LENGTHOF(kSingleFemale));
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    check(UGENDER_MALE, UGENDER_MALE, UGENDER_MALE, kSingleMale, LENGTHOF(kSingleMale));
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    check(UGENDER_OTHER, UGENDER_OTHER, UGENDER_OTHER, kSingleOther, LENGTHOF(kSingleOther));
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    check(UGENDER_OTHER, UGENDER_FEMALE, UGENDER_FEMALE, kAllFemale, LENGTHOF(kAllFemale));
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    check(UGENDER_OTHER, UGENDER_MALE, UGENDER_MALE, kAllMale, LENGTHOF(kAllMale));
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    check(UGENDER_OTHER, UGENDER_OTHER, UGENDER_MALE, kAllOther, LENGTHOF(kAllOther));
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    check(UGENDER_OTHER, UGENDER_OTHER, UGENDER_MALE, kFemaleMale, LENGTHOF(kFemaleMale));
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    check(UGENDER_OTHER, UGENDER_OTHER, UGENDER_MALE, kFemaleOther, LENGTHOF(kFemaleOther));
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    check(UGENDER_OTHER, UGENDER_OTHER, UGENDER_MALE, kMaleOther, LENGTHOF(kMaleOther));
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid GenderInfoTest::TestFallback() {
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UErrorCode status = U_ZERO_ERROR;
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  const GenderInfo* actual = GenderInfo::getInstance("xx", status);
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (U_FAILURE(status)) {
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errcheckln(status, "Fail to create GenderInfo - %s", u_errorName(status));
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return;
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  const GenderInfo* expected = GenderInfo::getNeutralInstance();
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (expected != actual) {
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errln("For Neutral, expected %d got %d", expected, actual);
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  actual = GenderInfo::getInstance("fr_CA", status);
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (U_FAILURE(status)) {
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errcheckln(status, "Fail to create GenderInfo - %s", u_errorName(status));
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return;
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  expected = GenderInfo::getMaleTaintsInstance();
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (expected != actual) {
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errln("For Male Taints, Expected %d got %d", expected, actual);
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid GenderInfoTest::check(
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UGender expected_neutral, UGender expected_mixed, UGender expected_taints, const UGender* genderList, int32_t listLength) {
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  checkLocale(Locale::getUS(), expected_neutral, genderList, listLength);
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  checkLocale("is", expected_mixed, genderList, listLength);
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  checkLocale(Locale::getFrench(), expected_taints, genderList, listLength);
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid GenderInfoTest::checkLocale(
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const Locale& locale, UGender expected, const UGender* genderList, int32_t listLength) {
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UErrorCode status = U_ZERO_ERROR;
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  const GenderInfo* gi = GenderInfo::getInstance(locale, status);
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (U_FAILURE(status)) {
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errcheckln(status, "Fail to create GenderInfo - %s", u_errorName(status));
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return;
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UGender actual = gi->getListGender(genderList, listLength, status);
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (U_FAILURE(status)) {
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errcheckln(status, "Fail to get gender of list - %s", u_errorName(status));
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return;
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (actual != expected) {
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errln("For locale: %s expected: %d got %d", locale.getName(), expected, actual);
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgextern IntlTest *createGenderInfoTest() {
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return new GenderInfoTest();
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */
123