Skip to content

Commit

Permalink
feat: #4 qti-map-response to support case sensitivity in mapping
Browse files Browse the repository at this point in the history
  • Loading branch information
Marcelh1983 committed Jan 28, 2025
1 parent e06b0c5 commit 1b086c5
Show file tree
Hide file tree
Showing 3 changed files with 152 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,131 @@ describe('qti-map-response', () => {
expect(qtiMapResponse.calculate()).toEqual(1);
});
});

describe('qti-map-response', () => {
it('should map the value correctly when case-sensitive is true', () => {
const template = () => html`
<qti-assessment-item>
<qti-response-declaration identifier="interaction_1" cardinality="single" base-type="string">
<qti-correct-response>
<qti-value>a</qti-value>
</qti-correct-response>
<qti-mapping default-value="0">
<qti-map-entry map-key="A" mapped-value="2" case-sensitive="true"></qti-map-entry>
<qti-map-entry map-key="a" mapped-value="1" case-sensitive="true"></qti-map-entry>
</qti-mapping>
</qti-response-declaration>
<qti-map-response identifier="interaction_1"></qti-map-response>
</qti-assessment-item>
`;
render(template(), document.body);

const assessmentItem = document.body.querySelector('qti-assessment-item') as QtiAssessmentItem;
assessmentItem.updateResponseVariable('interaction_1', 'a');

const qtiMapResponse = document.body.querySelector('qti-map-response') as QtiMapResponse;
expect(qtiMapResponse.getResult()).toEqual(1);
});

it('should map the value correctly when case-sensitive is default', () => {
const template = () => html`
<qti-assessment-item>
<qti-response-declaration identifier="interaction_1" cardinality="single" base-type="string">
<qti-correct-response>
<qti-value>a</qti-value>
</qti-correct-response>
<qti-mapping default-value="0">
<qti-map-entry map-key="A" mapped-value="2"></qti-map-entry>
</qti-mapping>
</qti-response-declaration>
<qti-map-response identifier="interaction_1"></qti-map-response>
</qti-assessment-item>
`;
render(template(), document.body);

const assessmentItem = document.body.querySelector('qti-assessment-item') as QtiAssessmentItem;
assessmentItem.updateResponseVariable('interaction_1', 'a');

const qtiMapResponse = document.body.querySelector('qti-map-response') as QtiMapResponse;
expect(qtiMapResponse.getResult()).toEqual(0);
});

describe('qti-map-response', () => {
it('should map the value 2 correctly when case-sensitive is true', () => {
const template = () => html`
<qti-assessment-item>
<qti-response-declaration identifier="interaction_1" cardinality="single" base-type="string">
<qti-correct-response>
<qti-value>a</qti-value>
</qti-correct-response>
<qti-mapping default-value="0" case-sensitive="true">
<qti-map-entry map-key="A" mapped-value="2" case-sensitive="true"></qti-map-entry>
<qti-map-entry map-key="a" mapped-value="1" case-sensitive="true"></qti-map-entry>
</qti-mapping>
</qti-response-declaration>
<qti-map-response identifier="interaction_1"></qti-map-response>
</qti-assessment-item>
`;
render(template(), document.body);

const assessmentItem = document.body.querySelector('qti-assessment-item') as QtiAssessmentItem;
assessmentItem.updateResponseVariable('interaction_1', 'A');

const qtiMapResponse = document.body.querySelector('qti-map-response') as QtiMapResponse;
expect(qtiMapResponse.getResult()).toEqual(2);
});
});

it('should map the value correctly when case-sensitive is false', () => {
const template = () => html`
<qti-assessment-item>
<qti-response-declaration identifier="interaction_1" cardinality="single" base-type="string">
<qti-correct-response>
<qti-value>a</qti-value>
</qti-correct-response>
<qti-mapping default-value="0">
<qti-map-entry map-key="A" mapped-value="2" case-sensitive="false"></qti-map-entry>
<qti-map-entry map-key="a" mapped-value="1" case-sensitive="false"></qti-map-entry>
</qti-mapping>
</qti-response-declaration>
<qti-map-response identifier="interaction_1"></qti-map-response>
</qti-assessment-item>
`;
render(template(), document.body);

const assessmentItem = document.body.querySelector('qti-assessment-item') as QtiAssessmentItem;
assessmentItem.updateResponseVariable('interaction_1', 'a');

const qtiMapResponse = document.body.querySelector('qti-map-response') as QtiMapResponse;
expect(qtiMapResponse.getResult()).toEqual(2);
});

it('should map not the value correctly when case-sensitive is true', () => {
const template = () => html`
<qti-assessment-item>
<qti-response-declaration identifier="interaction_1" cardinality="single" base-type="string">
<qti-correct-response>
<qti-value>a</qti-value>
</qti-correct-response>
<qti-mapping default-value="0">
<qti-map-entry map-key="A" mapped-value="2" case-sensitive="true"></qti-map-entry>
<qti-map-entry map-key="a" mapped-value="1" case-sensitive="true"></qti-map-entry>
</qti-mapping>
</qti-response-declaration>
<qti-map-response identifier="interaction_1"></qti-map-response>
</qti-assessment-item>
`;
render(template(), document.body);

const assessmentItem = document.body.querySelector('qti-assessment-item') as QtiAssessmentItem;
assessmentItem.updateResponseVariable('interaction_1', 'b');

const qtiMapResponse = document.body.querySelector('qti-map-response') as QtiMapResponse;
expect(qtiMapResponse.getResult()).toEqual(0);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,24 @@ export class QtiMapResponse extends QtiExpression<number> {
const candidateResponses = !Array.isArray(response.value) ? [response.value] : response.value;
let result = 0;
for (const candidateResponse of candidateResponses) {
const mappedValue = mapping.mapEntries.find(entry => {
return ScoringHelper.compareSingleValues(entry.mapKey, candidateResponse, response.baseType);
const mappedValues = mapping.mapEntries.filter(entry => {
if (response.baseType === 'string' && !entry.caseSensitive) {
return ScoringHelper.compareSingleValues(
entry.mapKey.toLowerCase(),
candidateResponse.toLowerCase(),
response.baseType
);
} else {
return ScoringHelper.compareSingleValues(entry.mapKey, candidateResponse, response.baseType);
}
});
// now find the mapped value with the highest value (if there are multiple)
const mappedValue = mappedValues.reduce(
(prev, current) => {
return prev.mappedValue > current.mappedValue ? prev : current;
},
{ mapKey: null, mappedValue: null }
);
if (!(mappedValue == null || mappedValue.mappedValue == undefined)) {
result += mappedValue.mappedValue;
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,15 @@ export class QtiMapping extends LitElement {

public get mapEntries() {
return Array.from(this.querySelectorAll('qti-map-entry')).map(el => {
const caseSensitive = el.hasAttribute('case-sensitive')
? el.getAttribute('case-sensitive') === 'false'
? false
: true
: true;
return {
mapKey: el.getAttribute('map-key'),
mappedValue: +el.getAttribute('mapped-value')
mappedValue: +el.getAttribute('mapped-value'),
caseSensitive
};
});
}
Expand Down

0 comments on commit 1b086c5

Please sign in to comment.