Skip to content

Commit 0c4bbeb

Browse files
committed
Inflection-77: Final issue resolved and added one CAPI test for iinf_createWithDefaults as InflectableStringConceptTest-c#testCreateWithDefaults
1 parent e3851a6 commit 0c4bbeb

File tree

3 files changed

+100
-13
lines changed

3 files changed

+100
-13
lines changed

inflection/src/inflection/dialog/DictionaryLookupFunction.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,6 @@ SpeakableString* DictionaryLookupFunction::getFeatureValue(const DisplayValue& d
124124
if (result.empty()) {
125125
return nullptr;
126126
}
127-
for(const auto& [feature, value]: displayValue.getConstraintMap()) {
128-
if (feature.getName() == u"speak") {
129-
return new SpeakableString(result, value);
130-
}
131-
}
132127
return new SpeakableString(result);
133128
}
134129

inflection/src/inflection/dialog/InflectableStringConcept.cpp

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,40 @@ SpeakableString* InflectableStringConcept::getFeatureValue(const SemanticFeature
5252
if (constraint != nullptr) {
5353
return new SpeakableString(*npc(constraint));
5454
}
55+
const auto displayValueResult = getDisplayValue(true);
56+
if (displayValueResult) {
57+
const auto defaultFeatureFunction = npc(getModel())->getDefaultFeatureFunction(feature);
58+
::std::unique_ptr<SpeakableString> computedValue;
59+
::std::unique_ptr<SpeakableString> baseValue;
60+
if (defaultFeatureFunction != nullptr) {
61+
computedValue.reset(npc(defaultFeatureFunction)->getFeatureValue(*displayValueResult, constraints));
62+
baseValue.reset(npc(defaultFeatureFunction)->getFeatureValue(defaultDisplayValue, constraints));
63+
}
64+
const auto& displayConstraintMap = displayValueResult->getConstraintMap();
65+
auto displayConstraint = displayConstraintMap.find(feature);
66+
if (displayConstraint != displayConstraintMap.end()) {
67+
auto numberFeature = npc(getModel())->getFeature(u"number");
68+
if (feature.getName() == u"gender" && baseValue && numberFeature != nullptr && displayConstraintMap.find(*npc(numberFeature)) != displayConstraintMap.end()) {
69+
return baseValue.release();
70+
}
71+
return new SpeakableString(displayConstraint->second);
72+
}
73+
if (computedValue) {
74+
return computedValue.release();
75+
}
76+
if (baseValue) {
77+
return baseValue.release();
78+
}
79+
}
80+
const auto& initialConstraintMap = defaultDisplayValue.getConstraintMap();
81+
auto initialConstraint = initialConstraintMap.find(feature);
82+
if (initialConstraint != initialConstraintMap.end()) {
83+
return new SpeakableString(initialConstraint->second);
84+
}
5585
auto defaultFeatureFunction = npc(getModel())->getDefaultFeatureFunction(feature);
5686
if (defaultFeatureFunction != nullptr) {
57-
const auto displayValueResult = getDisplayValue(true);
58-
if (displayValueResult) {
59-
return npc(defaultFeatureFunction)->getFeatureValue(*displayValueResult, constraints);
87+
if (auto fallbackValue = ::std::unique_ptr<SpeakableString>(npc(defaultFeatureFunction)->getFeatureValue(defaultDisplayValue, constraints))) {
88+
return fallbackValue.release();
6089
}
6190
}
6291
return nullptr;
@@ -76,11 +105,7 @@ ::std::optional<DisplayValue> InflectableStringConcept::getDisplayValue(bool all
76105
{
77106
auto defaultDisplayFunction = npc(getModel())->getDefaultDisplayFunction();
78107
if (defaultDisplayFunction != nullptr && !constraints.empty()) {
79-
::std::map<SemanticFeature, ::std::u16string> constraintMap;
80-
if (!value.speakEqualsPrint()) {
81-
constraintMap.emplace(*npc(getSpeakFeature()), value.getSpeak());
82-
}
83-
SemanticFeatureModel_DisplayData displayData({DisplayValue(value.getPrint(), constraintMap)});
108+
SemanticFeatureModel_DisplayData displayData({defaultDisplayValue});
84109
::std::unique_ptr<DisplayValue> returnVal(npc(defaultDisplayFunction)->getDisplayValue(displayData, constraints, allowInflectionGuess));
85110
if (returnVal != nullptr) {
86111
return *returnVal;

inflection/test/src/inflection/dialog/InflectableStringConceptTest-c.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,73 @@ TEST_CASE("InflectableStringConceptTest-c#testExistsAPISpanish")
155155
iinf_destroy(inflectableConcept);
156156
}
157157

158+
TEST_CASE("InflectableStringConceptTest-c#testCreateWithDefaults")
159+
{
160+
auto error = U_ZERO_ERROR;
161+
auto ccfp = ilccfp_getDefaultCommonConceptFactoryProvider(&error);
162+
REQUIRE(U_SUCCESS(error));
163+
164+
const auto locale = ::inflection::util::LocaleUtils::SPANISH().getName().c_str();
165+
auto ccf = ilccfp_getCommonConceptFactory(ccfp, locale, &error);
166+
REQUIRE(U_SUCCESS(error));
167+
168+
auto model = iccf_getSemanticFeatureModel(ccf, &error);
169+
REQUIRE(U_SUCCESS(error));
170+
171+
const std::u16string source = u"cometa";
172+
auto sourceString = iss_create(source.c_str(), static_cast<int32_t>(source.size()), &error);
173+
REQUIRE(U_SUCCESS(error));
174+
175+
IDDisplayValue_Constraint defaultConstraints[] = {
176+
{u"gender", u"masculine"},
177+
};
178+
179+
auto inflectableConcept = iinf_createWithDefaults(model,
180+
sourceString,
181+
defaultConstraints,
182+
static_cast<int32_t>(sizeof(defaultConstraints) / sizeof(defaultConstraints[0])),
183+
&error);
184+
iss_destroy(sourceString);
185+
REQUIRE(U_SUCCESS(error));
186+
REQUIRE(inflectableConcept != nullptr);
187+
188+
auto semanticConcept = iinf_toSemanticFeatureConcept(inflectableConcept, &error);
189+
REQUIRE(U_SUCCESS(error));
190+
191+
isfc_putConstraintByName(semanticConcept, u"definiteness", u"definite", -1, &error);
192+
REQUIRE(U_SUCCESS(error));
193+
194+
auto printedValue = isfc_toSpeakableStringCopy(semanticConcept, &error);
195+
REQUIRE(U_SUCCESS(error));
196+
util::StringContainer<IDSpeakableString, iss_getPrint> printedContainer(printedValue);
197+
REQUIRE(printedContainer);
198+
CHECK(printedContainer.value == u"el cometa");
199+
iss_destroy(printedValue);
200+
201+
auto genderValue = isfc_createFeatureValueByNameCopy(semanticConcept, u"gender", &error);
202+
REQUIRE(U_SUCCESS(error));
203+
util::StringContainer<IDSpeakableString, iss_getPrint> genderContainer(genderValue);
204+
REQUIRE(genderContainer);
205+
CHECK(genderContainer.value == u"masculine");
206+
iss_destroy(genderValue);
207+
208+
auto numberValue = isfc_createFeatureValueByNameCopy(semanticConcept, u"number", &error);
209+
REQUIRE(U_SUCCESS(error));
210+
util::StringContainer<IDSpeakableString, iss_getPrint> numberContainer(numberValue);
211+
REQUIRE(numberContainer);
212+
CHECK(numberContainer.value == u"singular");
213+
iss_destroy(numberValue);
214+
215+
auto definitenessValue = isfc_createFeatureValueByNameCopy(semanticConcept, u"definiteness", &error);
216+
REQUIRE(U_SUCCESS(error));
217+
util::StringContainer<IDSpeakableString, iss_getPrint> definitenessContainer(definitenessValue);
218+
REQUIRE(definitenessContainer);
219+
CHECK(definitenessContainer.value == u"definite");
220+
iss_destroy(definitenessValue);
221+
222+
iinf_destroy(inflectableConcept);
223+
}
224+
158225
TEST_CASE("InflectableStringConceptTest-c#testSpanish")
159226
{
160227
auto error = U_ZERO_ERROR;

0 commit comments

Comments
 (0)