Throw message for ValidationExceptions

This commit is contained in:
Daniel Cortés
2021-04-28 20:07:11 +02:00
committed by Jonathan Putney
parent 7b92c65061
commit 67bf600c52
9 changed files with 156 additions and 70 deletions

View File

@@ -9,6 +9,7 @@ import {
} from './scorm12_cmi'; } from './scorm12_cmi';
const aicc_constants = APIConstants.aicc; const aicc_constants = APIConstants.aicc;
const scorm12_constants = APIConstants.scorm12;
const aicc_regex = Regex.aicc; const aicc_regex = Regex.aicc;
const scorm12_error_codes = ErrorCodes.scorm12; const scorm12_error_codes = ErrorCodes.scorm12;
@@ -126,8 +127,11 @@ class CMIEvaluationComments extends CMIArray {
* Constructor for AICC Evaluation Comments object * Constructor for AICC Evaluation Comments object
*/ */
constructor() { constructor() {
super(aicc_constants.comments_children, super({
scorm12_error_codes.INVALID_SET_VALUE); children: aicc_constants.comments_children,
errorCode: scorm12_error_codes.INVALID_SET_VALUE,
errorMessage: scorm12_constants.error_descriptions[scorm12_error_codes.INVALID_SET_VALUE].detailMessage,
});
} }
} }
@@ -143,6 +147,7 @@ class AICCStudentPreferences extends Scorm12CMI.CMIStudentPreference {
this.windows = new CMIArray({ this.windows = new CMIArray({
errorCode: scorm12_error_codes.INVALID_SET_VALUE, errorCode: scorm12_error_codes.INVALID_SET_VALUE,
errorMessage: scorm12_constants.error_descriptions[scorm12_error_codes.INVALID_SET_VALUE].detailMessage,
children: '', children: '',
}); });
} }
@@ -671,7 +676,7 @@ export class CMIPaths extends CMIArray {
* Constructor for inline Paths Array class * Constructor for inline Paths Array class
*/ */
constructor() { constructor() {
super(aicc_constants.paths_children); super({children: aicc_constants.paths_children});
} }
} }
@@ -837,7 +842,7 @@ export class CMITries extends CMIArray {
* Constructor for inline Tries Array class * Constructor for inline Tries Array class
*/ */
constructor() { constructor() {
super(aicc_constants.tries_children); super({children: aicc_constants.tries_children});
} }
} }
@@ -856,8 +861,11 @@ export class CMITriesObject extends BaseCMI {
score_children: aicc_constants.score_children, score_children: aicc_constants.score_children,
score_range: aicc_regex.score_range, score_range: aicc_regex.score_range,
invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE, invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,
invalidErrorMessage: scorm12_constants.error_descriptions[scorm12_error_codes.INVALID_SET_VALUE].detailMessage,
invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH, invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,
invalidTypeMessage: scorm12_constants.error_descriptions[scorm12_error_codes.TYPE_MISMATCH].detailMessage,
invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE, invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,
invalidRangeMessage: scorm12_constants.error_descriptions[scorm12_error_codes.VALUE_OUT_OF_RANGE].detailMessage,
}); });
} }
@@ -938,7 +946,7 @@ export class CMIAttemptRecords extends CMIArray {
* Constructor for inline Tries Array class * Constructor for inline Tries Array class
*/ */
constructor() { constructor() {
super(aicc_constants.attempt_records_children); super({children: aicc_constants.attempt_records_children});
} }
} }
@@ -957,8 +965,11 @@ export class CMIAttemptRecordsObject extends BaseCMI {
score_children: aicc_constants.score_children, score_children: aicc_constants.score_children,
score_range: aicc_regex.score_range, score_range: aicc_regex.score_range,
invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE, invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,
invalidErrorMessage: scorm12_constants.error_descriptions[scorm12_error_codes.INVALID_SET_VALUE].detailMessage,
invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH, invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,
invalidTypeMessage: scorm12_constants.error_descriptions[scorm12_error_codes.TYPE_MISMATCH].detailMessage,
invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE, invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,
invalidRangeMessage: scorm12_constants.error_descriptions[scorm12_error_codes.VALUE_OUT_OF_RANGE].detailMessage,
}); });
} }

View File

@@ -14,6 +14,7 @@ const scorm12_error_codes = ErrorCodes.scorm12;
* @param {string} value * @param {string} value
* @param {string} regexPattern * @param {string} regexPattern
* @param {number} errorCode * @param {number} errorCode
* @param {string} errorMessage
* @param {boolean} allowEmptyString * @param {boolean} allowEmptyString
* @return {boolean} * @return {boolean}
*/ */
@@ -21,6 +22,7 @@ export function checkValidFormat(
value: String, value: String,
regexPattern: String, regexPattern: String,
errorCode: number, errorCode: number,
errorMessage: String,
allowEmptyString?: boolean) { allowEmptyString?: boolean) {
const formatRegex = new RegExp(regexPattern); const formatRegex = new RegExp(regexPattern);
const matches = value.match(formatRegex); const matches = value.match(formatRegex);
@@ -28,7 +30,7 @@ export function checkValidFormat(
return true; return true;
} }
if (value === undefined || !matches || matches[0] === '') { if (value === undefined || !matches || matches[0] === '') {
throw new ValidationError(errorCode); throw new ValidationError(errorCode, errorMessage);
} }
return true; return true;
} }
@@ -39,20 +41,21 @@ export function checkValidFormat(
* @param {*} value * @param {*} value
* @param {string} rangePattern * @param {string} rangePattern
* @param {number} errorCode * @param {number} errorCode
* @param {string} errorMessage
* @return {boolean} * @return {boolean}
*/ */
export function checkValidRange( export function checkValidRange(
value: any, rangePattern: String, errorCode: number) { value: any, rangePattern: String, errorCode: number, errorMessage: String) {
const ranges = rangePattern.split('#'); const ranges = rangePattern.split('#');
value = value * 1.0; value = value * 1.0;
if (value >= ranges[0]) { if (value >= ranges[0]) {
if ((ranges[1] === '*') || (value <= ranges[1])) { if ((ranges[1] === '*') || (value <= ranges[1])) {
return true; return true;
} else { } else {
throw new ValidationError(errorCode); throw new ValidationError(errorCode, errorMessage);
} }
} else { } else {
throw new ValidationError(errorCode); throw new ValidationError(errorCode, errorMessage);
} }
} }
@@ -115,8 +118,11 @@ export class CMIScore extends BaseCMI {
* @param {string} score_range * @param {string} score_range
* @param {string} max * @param {string} max
* @param {number} invalidErrorCode * @param {number} invalidErrorCode
* @param {string} invalidErrorMessage
* @param {number} invalidTypeCode * @param {number} invalidTypeCode
* @param {string} invalidTypeMessage
* @param {number} invalidRangeCode * @param {number} invalidRangeCode
* @param {string} invalidRangeMessage
* @param {string} decimalRegex * @param {string} decimalRegex
*/ */
constructor( constructor(
@@ -125,8 +131,11 @@ export class CMIScore extends BaseCMI {
score_range, score_range,
max, max,
invalidErrorCode, invalidErrorCode,
invalidErrorMessage,
invalidTypeCode, invalidTypeCode,
invalidTypeMessage,
invalidRangeCode, invalidRangeCode,
invalidRangeMessage,
decimalRegex, decimalRegex,
}) { }) {
super(); super();
@@ -137,10 +146,16 @@ export class CMIScore extends BaseCMI {
this.#max = (max || max === '') ? max : '100'; this.#max = (max || max === '') ? max : '100';
this.#_invalid_error_code = invalidErrorCode || this.#_invalid_error_code = invalidErrorCode ||
scorm12_error_codes.INVALID_SET_VALUE; scorm12_error_codes.INVALID_SET_VALUE;
this.#_invalid_error_message = invalidErrorMessage ||
scorm12_constants.error_descriptions[scorm12_error_codes.INVALID_SET_VALUE].detailMessage;
this.#_invalid_type_code = invalidTypeCode || this.#_invalid_type_code = invalidTypeCode ||
scorm12_error_codes.TYPE_MISMATCH; scorm12_error_codes.TYPE_MISMATCH;
this.#_invalid_type_message = invalidTypeMessage ||
scorm12_constants.error_descriptions[scorm12_error_codes.TYPE_MISMATCH].detailMessage;
this.#_invalid_range_code = invalidRangeCode || this.#_invalid_range_code = invalidRangeCode ||
scorm12_error_codes.VALUE_OUT_OF_RANGE; scorm12_error_codes.VALUE_OUT_OF_RANGE;
this.#_invalid_range_message = invalidRangeMessage ||
scorm12_constants.error_descriptions[scorm12_error_codes.VALUE_OUT_OF_RANGE].detailMessage;
this.#_decimal_regex = decimalRegex || this.#_decimal_regex = decimalRegex ||
scorm12_regex.CMIDecimal; scorm12_regex.CMIDecimal;
} }
@@ -148,8 +163,11 @@ export class CMIScore extends BaseCMI {
#_children; #_children;
#_score_range; #_score_range;
#_invalid_error_code; #_invalid_error_code;
#_invalid_error_message;
#_invalid_type_code; #_invalid_type_code;
#_invalid_type_message;
#_invalid_range_code; #_invalid_range_code;
#_invalid_range_message;
#_decimal_regex; #_decimal_regex;
#raw = ''; #raw = '';
#min = ''; #min = '';
@@ -170,7 +188,7 @@ export class CMIScore extends BaseCMI {
* @private * @private
*/ */
set _children(_children) { set _children(_children) {
throw new ValidationError(this.#_invalid_error_code); throw new ValidationError(this.#_invalid_error_code, this.#_invalid_error_message);
} }
/** /**
@@ -187,10 +205,10 @@ export class CMIScore extends BaseCMI {
*/ */
set raw(raw) { set raw(raw) {
if (checkValidFormat(raw, this.#_decimal_regex, if (checkValidFormat(raw, this.#_decimal_regex,
this.#_invalid_type_code) && this.#_invalid_type_code, this.#_invalid_type_message) &&
(!this.#_score_range || (!this.#_score_range ||
checkValidRange(raw, this.#_score_range, checkValidRange(raw, this.#_score_range,
this.#_invalid_range_code))) { this.#_invalid_range_code, this.#_invalid_range_message))) {
this.#raw = raw; this.#raw = raw;
} }
} }
@@ -209,10 +227,10 @@ export class CMIScore extends BaseCMI {
*/ */
set min(min) { set min(min) {
if (checkValidFormat(min, this.#_decimal_regex, if (checkValidFormat(min, this.#_decimal_regex,
this.#_invalid_type_code) && this.#_invalid_type_code, this.#_invalid_type_message) &&
(!this.#_score_range || (!this.#_score_range ||
checkValidRange(min, this.#_score_range, checkValidRange(min, this.#_score_range,
this.#_invalid_range_code))) { this.#_invalid_range_code, this.#_invalid_range_message))) {
this.#min = min; this.#min = min;
} }
} }
@@ -231,10 +249,10 @@ export class CMIScore extends BaseCMI {
*/ */
set max(max) { set max(max) {
if (checkValidFormat(max, this.#_decimal_regex, if (checkValidFormat(max, this.#_decimal_regex,
this.#_invalid_type_code) && this.#_invalid_type_code, this.#_invalid_type_message) &&
(!this.#_score_range || (!this.#_score_range ||
checkValidRange(max, this.#_score_range, checkValidRange(max, this.#_score_range,
this.#_invalid_range_code))) { this.#_invalid_range_code, this.#_invalid_range_message))) {
this.#max = max; this.#max = max;
} }
} }
@@ -263,15 +281,18 @@ export class CMIArray extends BaseCMI {
* Constructor cmi *.n arrays * Constructor cmi *.n arrays
* @param {string} children * @param {string} children
* @param {number} errorCode * @param {number} errorCode
* @param {string} errorMessage
*/ */
constructor({children, errorCode}) { constructor({children, errorCode, errorMessage}) {
super(); super();
this.#_children = children; this.#_children = children;
this.#errorCode = errorCode; this.#errorCode = errorCode;
this.#errorMessage = errorMessage;
this.childArray = []; this.childArray = [];
} }
#errorCode; #errorCode;
#errorMessage;
#_children; #_children;
/** /**
@@ -287,7 +308,7 @@ export class CMIArray extends BaseCMI {
* @param {string} _children * @param {string} _children
*/ */
set _children(_children) { set _children(_children) {
throw new ValidationError(this.#errorCode); throw new ValidationError(this.#errorCode, this.#errorMessage);
} }
/** /**
@@ -303,7 +324,7 @@ export class CMIArray extends BaseCMI {
* @param {number} _count * @param {number} _count
*/ */
set _count(_count) { set _count(_count) {
throw new ValidationError(this.#errorCode); throw new ValidationError(this.#errorCode, this.#errorMessage);
} }
/** /**

View File

@@ -21,21 +21,30 @@ const scorm12_error_codes = ErrorCodes.scorm12;
* Helper method for throwing Read Only error * Helper method for throwing Read Only error
*/ */
export function throwReadOnlyError() { export function throwReadOnlyError() {
throw new ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT); throw new ValidationError(
scorm12_error_codes.READ_ONLY_ELEMENT,
scorm12_constants.error_descriptions[scorm12_error_codes.READ_ONLY_ELEMENT].detailMessage
);
} }
/** /**
* Helper method for throwing Write Only error * Helper method for throwing Write Only error
*/ */
export function throwWriteOnlyError() { export function throwWriteOnlyError() {
throw new ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT); throw new ValidationError(
scorm12_error_codes.WRITE_ONLY_ELEMENT,
scorm12_constants.error_descriptions[scorm12_error_codes.WRITE_ONLY_ELEMENT].detailMessage
);
} }
/** /**
* Helper method for throwing Invalid Set error * Helper method for throwing Invalid Set error
*/ */
function throwInvalidValueError() { function throwInvalidValueError() {
throw new ValidationError(scorm12_error_codes.INVALID_SET_VALUE); throw new ValidationError(
scorm12_error_codes.INVALID_SET_VALUE,
scorm12_constants.error_descriptions[scorm12_error_codes.INVALID_SET_VALUE].detailMessage
);
} }
/** /**
@@ -50,7 +59,9 @@ export function check12ValidFormat(
regexPattern: String, regexPattern: String,
allowEmptyString?: boolean) { allowEmptyString?: boolean) {
return checkValidFormat(value, regexPattern, return checkValidFormat(value, regexPattern,
scorm12_error_codes.TYPE_MISMATCH, allowEmptyString); scorm12_error_codes.TYPE_MISMATCH,
scorm12_constants.error_descriptions[scorm12_error_codes.TYPE_MISMATCH].detailMessage,
allowEmptyString);
} }
/** /**
@@ -65,7 +76,9 @@ export function check12ValidRange(
rangePattern: String, rangePattern: String,
allowEmptyString?: boolean) { allowEmptyString?: boolean) {
return checkValidRange(value, rangePattern, return checkValidRange(value, rangePattern,
scorm12_error_codes.VALUE_OUT_OF_RANGE, allowEmptyString); scorm12_error_codes.VALUE_OUT_OF_RANGE,
scorm12_constants.error_descriptions[scorm12_error_codes.VALUE_OUT_OF_RANGE].detailMessage,
allowEmptyString);
} }
/** /**
@@ -275,8 +288,11 @@ class CMICore extends BaseCMI {
score_children: scorm12_constants.score_children, score_children: scorm12_constants.score_children,
score_range: scorm12_regex.score_range, score_range: scorm12_regex.score_range,
invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE, invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,
invalidErrorMessage: scorm12_constants.error_descriptions[scorm12_error_codes.INVALID_SET_VALUE].detailMessage,
invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH, invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,
invalidTypeMessage: scorm12_constants.error_descriptions[scorm12_error_codes.TYPE_MISMATCH].detailMessage,
invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE, invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,
invalidRangeMessage: scorm12_constants.error_descriptions[scorm12_error_codes.VALUE_OUT_OF_RANGE].detailMessage,
}); });
} }
@@ -583,6 +599,7 @@ class CMIObjectives extends CMIArray {
super({ super({
children: scorm12_constants.objectives_children, children: scorm12_constants.objectives_children,
errorCode: scorm12_error_codes.INVALID_SET_VALUE, errorCode: scorm12_error_codes.INVALID_SET_VALUE,
errorMessage: scorm12_constants.error_descriptions[scorm12_error_codes.INVALID_SET_VALUE].detailMessage,
}); });
} }
} }
@@ -858,6 +875,7 @@ class CMIInteractions extends CMIArray {
super({ super({
children: scorm12_constants.interactions_children, children: scorm12_constants.interactions_children,
errorCode: scorm12_error_codes.INVALID_SET_VALUE, errorCode: scorm12_error_codes.INVALID_SET_VALUE,
errorMessage: scorm12_constants.error_descriptions[scorm12_error_codes.INVALID_SET_VALUE].detailMessage,
}); });
} }
} }
@@ -875,10 +893,12 @@ export class CMIInteractionsObject extends BaseCMI {
this.objectives = new CMIArray({ this.objectives = new CMIArray({
errorCode: scorm12_error_codes.INVALID_SET_VALUE, errorCode: scorm12_error_codes.INVALID_SET_VALUE,
errorMessage: scorm12_constants.error_descriptions[scorm12_error_codes.INVALID_SET_VALUE].detailMessage,
children: scorm12_constants.objectives_children, children: scorm12_constants.objectives_children,
}); });
this.correct_responses = new CMIArray({ this.correct_responses = new CMIArray({
errorCode: scorm12_error_codes.INVALID_SET_VALUE, errorCode: scorm12_error_codes.INVALID_SET_VALUE,
errorMessage: scorm12_constants.error_descriptions[scorm12_error_codes.INVALID_SET_VALUE].detailMessage,
children: scorm12_constants.correct_responses_children, children: scorm12_constants.correct_responses_children,
}); });
} }
@@ -1080,8 +1100,11 @@ export class CMIObjectivesObject extends BaseCMI {
score_children: scorm12_constants.score_children, score_children: scorm12_constants.score_children,
score_range: scorm12_regex.score_range, score_range: scorm12_regex.score_range,
invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE, invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,
invalidErrorMessage: scorm12_constants.error_descriptions[scorm12_error_codes.INVALID_SET_VALUE].detailMessage,
invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH, invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,
invalidTypeMessage: scorm12_constants.error_descriptions[scorm12_error_codes.TYPE_MISMATCH].detailMessage,
invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE, invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,
invalidRangeMessage: scorm12_constants.error_descriptions[scorm12_error_codes.VALUE_OUT_OF_RANGE].detailMessage,
}); });
} }

View File

@@ -23,21 +23,50 @@ const scorm2004_regex = Regex.scorm2004;
* Helper method for throwing Read Only error * Helper method for throwing Read Only error
*/ */
function throwReadOnlyError() { function throwReadOnlyError() {
throw new ValidationError(scorm2004_error_codes.READ_ONLY_ELEMENT); throw new ValidationError(
scorm2004_error_codes.READ_ONLY_ELEMENT,
scorm2004_constants.error_descriptions[scorm2004_error_codes.READ_ONLY_ELEMENT].detailMessage
);
} }
/** /**
* Helper method for throwing Write Only error * Helper method for throwing Write Only error
*/ */
function throwWriteOnlyError() { function throwWriteOnlyError() {
throw new ValidationError(scorm2004_error_codes.WRITE_ONLY_ELEMENT); throw new ValidationError(
scorm2004_error_codes.WRITE_ONLY_ELEMENT,
scorm2004_constants.error_descriptions[scorm2004_error_codes.WRITE_ONLY_ELEMENT].detailMessage
);
} }
/** /**
* Helper method for throwing Type Mismatch error * Helper method for throwing Type Mismatch error
*/ */
function throwTypeMismatchError() { function throwTypeMismatchError() {
throw new ValidationError(scorm2004_error_codes.TYPE_MISMATCH); throw new ValidationError(
scorm2004_error_codes.TYPE_MISMATCH,
scorm2004_constants.error_descriptions[scorm2004_error_codes.TYPE_MISMATCH].detailMessage
);
}
/**
* Helper method for throwing Dependency Not Established error
*/
function throwDependencyNotEstablishedError() {
throw new ValidationError(
scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED,
scorm2004_constants.error_descriptions[scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED].detailMessage
);
}
/**
* Helper method for throwing Dependency Not Established error
*/
function throwGeneralSetError() {
throw new ValidationError(
scorm2004_error_codes.GENERAL_SET_FAILURE,
scorm2004_constants.error_descriptions[scorm2004_error_codes.GENERAL_SET_FAILURE].detailMessage
);
} }
/** /**
@@ -52,7 +81,9 @@ function check2004ValidFormat(
regexPattern: String, regexPattern: String,
allowEmptyString?: boolean) { allowEmptyString?: boolean) {
return checkValidFormat(value, regexPattern, return checkValidFormat(value, regexPattern,
scorm2004_error_codes.TYPE_MISMATCH, allowEmptyString); scorm2004_error_codes.TYPE_MISMATCH,
scorm2004_constants.error_descriptions[scorm2004_error_codes.TYPE_MISMATCH].detailMessage,
allowEmptyString);
} }
/** /**
@@ -63,7 +94,8 @@ function check2004ValidFormat(
*/ */
function check2004ValidRange(value: any, rangePattern: String) { function check2004ValidRange(value: any, rangePattern: String) {
return checkValidRange(value, rangePattern, return checkValidRange(value, rangePattern,
scorm2004_error_codes.VALUE_OUT_OF_RANGE); scorm2004_error_codes.VALUE_OUT_OF_RANGE,
scorm2004_constants.error_descriptions[scorm2004_error_codes.VALUE_OUT_OF_RANGE].detailMessage);
} }
/** /**
@@ -701,6 +733,7 @@ class CMIInteractions extends CMIArray {
super({ super({
children: scorm2004_constants.interactions_children, children: scorm2004_constants.interactions_children,
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT, errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
errorMessage: scorm2004_constants.error_descriptions[scorm2004_error_codes.READ_ONLY_ELEMENT].detailMessage,
}); });
} }
} }
@@ -716,6 +749,7 @@ class CMIObjectives extends CMIArray {
super({ super({
children: scorm2004_constants.objectives_children, children: scorm2004_constants.objectives_children,
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT, errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
errorMessage: scorm2004_constants.error_descriptions[scorm2004_error_codes.READ_ONLY_ELEMENT].detailMessage,
}); });
} }
} }
@@ -731,6 +765,7 @@ class CMICommentsFromLMS extends CMIArray {
super({ super({
children: scorm2004_constants.comments_children, children: scorm2004_constants.comments_children,
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT, errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
errorMessage: scorm2004_constants.error_descriptions[scorm2004_error_codes.READ_ONLY_ELEMENT].detailMessage,
}); });
} }
} }
@@ -746,6 +781,7 @@ class CMICommentsFromLearner extends CMIArray {
super({ super({
children: scorm2004_constants.comments_children, children: scorm2004_constants.comments_children,
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT, errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
errorMessage: scorm2004_constants.error_descriptions[scorm2004_error_codes.READ_ONLY_ELEMENT].detailMessage,
}); });
} }
} }
@@ -771,10 +807,12 @@ export class CMIInteractionsObject extends BaseCMI {
this.objectives = new CMIArray({ this.objectives = new CMIArray({
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT, errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
errorMessage: scorm2004_constants.error_descriptions[scorm2004_error_codes.INVALID_SET_VALUE].detailMessage,
children: scorm2004_constants.objectives_children, children: scorm2004_constants.objectives_children,
}); });
this.correct_responses = new CMIArray({ this.correct_responses = new CMIArray({
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT, errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
errorMessage: scorm2004_constants.error_descriptions[scorm2004_error_codes.INVALID_SET_VALUE].detailMessage,
children: scorm2004_constants.correct_responses_children, children: scorm2004_constants.correct_responses_children,
}); });
} }
@@ -820,8 +858,7 @@ export class CMIInteractionsObject extends BaseCMI {
*/ */
set type(type) { set type(type) {
if (this.initialized && this.#id === '') { if (this.initialized && this.#id === '') {
throw new ValidationError( throwDependencyNotEstablishedError();
scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
} else { } else {
if (check2004ValidFormat(type, scorm2004_regex.CMIType)) { if (check2004ValidFormat(type, scorm2004_regex.CMIType)) {
this.#type = type; this.#type = type;
@@ -843,8 +880,7 @@ export class CMIInteractionsObject extends BaseCMI {
*/ */
set timestamp(timestamp) { set timestamp(timestamp) {
if (this.initialized && this.#id === '') { if (this.initialized && this.#id === '') {
throw new ValidationError( throwDependencyNotEstablishedError();
scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
} else { } else {
if (check2004ValidFormat(timestamp, scorm2004_regex.CMITime)) { if (check2004ValidFormat(timestamp, scorm2004_regex.CMITime)) {
this.#timestamp = timestamp; this.#timestamp = timestamp;
@@ -866,8 +902,7 @@ export class CMIInteractionsObject extends BaseCMI {
*/ */
set weighting(weighting) { set weighting(weighting) {
if (this.initialized && this.#id === '') { if (this.initialized && this.#id === '') {
throw new ValidationError( throwDependencyNotEstablishedError();
scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
} else { } else {
if (check2004ValidFormat(weighting, scorm2004_regex.CMIDecimal)) { if (check2004ValidFormat(weighting, scorm2004_regex.CMIDecimal)) {
this.#weighting = weighting; this.#weighting = weighting;
@@ -890,8 +925,7 @@ export class CMIInteractionsObject extends BaseCMI {
*/ */
set learner_response(learner_response) { set learner_response(learner_response) {
if (this.initialized && (this.#type === '' || this.#id === '')) { if (this.initialized && (this.#type === '' || this.#id === '')) {
throw new ValidationError( throwDependencyNotEstablishedError();
scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
} else { } else {
let nodes = []; let nodes = [];
const response_type = learner_responses[this.type]; const response_type = learner_responses[this.type];
@@ -933,12 +967,12 @@ export class CMIInteractionsObject extends BaseCMI {
} }
} }
} else { } else {
throw new ValidationError(scorm2004_error_codes.GENERAL_SET_FAILURE); throwGeneralSetError();
} }
this.#learner_response = learner_response; this.#learner_response = learner_response;
} else { } else {
throw new ValidationError(scorm2004_error_codes.TYPE_MISMATCH); throwTypeMismatchError();
} }
} }
} }
@@ -975,8 +1009,7 @@ export class CMIInteractionsObject extends BaseCMI {
*/ */
set latency(latency) { set latency(latency) {
if (this.initialized && this.#id === '') { if (this.initialized && this.#id === '') {
throw new ValidationError( throwDependencyNotEstablishedError();
scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
} else { } else {
if (check2004ValidFormat(latency, scorm2004_regex.CMITimespan)) { if (check2004ValidFormat(latency, scorm2004_regex.CMITimespan)) {
this.#latency = latency; this.#latency = latency;
@@ -998,8 +1031,7 @@ export class CMIInteractionsObject extends BaseCMI {
*/ */
set description(description) { set description(description) {
if (this.initialized && this.#id === '') { if (this.initialized && this.#id === '') {
throw new ValidationError( throwDependencyNotEstablishedError();
scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
} else { } else {
if (check2004ValidFormat(description, scorm2004_regex.CMILangString250, if (check2004ValidFormat(description, scorm2004_regex.CMILangString250,
true)) { true)) {
@@ -1104,8 +1136,7 @@ export class CMIObjectivesObject extends BaseCMI {
*/ */
set success_status(success_status) { set success_status(success_status) {
if (this.initialized && this.#id === '') { if (this.initialized && this.#id === '') {
throw new ValidationError( throwDependencyNotEstablishedError();
scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
} else { } else {
if (check2004ValidFormat(success_status, scorm2004_regex.CMISStatus)) { if (check2004ValidFormat(success_status, scorm2004_regex.CMISStatus)) {
this.#success_status = success_status; this.#success_status = success_status;
@@ -1127,8 +1158,7 @@ export class CMIObjectivesObject extends BaseCMI {
*/ */
set completion_status(completion_status) { set completion_status(completion_status) {
if (this.initialized && this.#id === '') { if (this.initialized && this.#id === '') {
throw new ValidationError( throwDependencyNotEstablishedError();
scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
} else { } else {
if (check2004ValidFormat(completion_status, scorm2004_regex.CMICStatus)) { if (check2004ValidFormat(completion_status, scorm2004_regex.CMICStatus)) {
this.#completion_status = completion_status; this.#completion_status = completion_status;
@@ -1150,8 +1180,7 @@ export class CMIObjectivesObject extends BaseCMI {
*/ */
set progress_measure(progress_measure) { set progress_measure(progress_measure) {
if (this.initialized && this.#id === '') { if (this.initialized && this.#id === '') {
throw new ValidationError( throwDependencyNotEstablishedError();
scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
} else { } else {
if (check2004ValidFormat(progress_measure, scorm2004_regex.CMIDecimal) && if (check2004ValidFormat(progress_measure, scorm2004_regex.CMIDecimal) &&
check2004ValidRange(progress_measure, check2004ValidRange(progress_measure,
@@ -1175,8 +1204,7 @@ export class CMIObjectivesObject extends BaseCMI {
*/ */
set description(description) { set description(description) {
if (this.initialized && this.#id === '') { if (this.initialized && this.#id === '') {
throw new ValidationError( throwDependencyNotEstablishedError();
scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
} else { } else {
if (check2004ValidFormat(description, scorm2004_regex.CMILangString250, if (check2004ValidFormat(description, scorm2004_regex.CMILangString250,
true)) { true)) {
@@ -1229,8 +1257,11 @@ class Scorm2004CMIScore extends CMIScore {
score_children: scorm2004_constants.score_children, score_children: scorm2004_constants.score_children,
max: '', max: '',
invalidErrorCode: scorm2004_error_codes.READ_ONLY_ELEMENT, invalidErrorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
invalidErrorMessage: scorm2004_constants.error_descriptions[scorm2004_error_codes.READ_ONLY_ELEMENT].detailMessage,
invalidTypeCode: scorm2004_error_codes.TYPE_MISMATCH, invalidTypeCode: scorm2004_error_codes.TYPE_MISMATCH,
invalidTypeMessage: scorm2004_constants.error_descriptions[scorm2004_error_codes.TYPE_MISMATCH].detailMessage,
invalidRangeCode: scorm2004_error_codes.VALUE_OUT_OF_RANGE, invalidRangeCode: scorm2004_error_codes.VALUE_OUT_OF_RANGE,
invalidRangeMessage: scorm2004_constants.error_descriptions[scorm2004_error_codes.VALUE_OUT_OF_RANGE].detailMessage,
decimalRegex: scorm2004_regex.CMIDecimal, decimalRegex: scorm2004_regex.CMIDecimal,
}); });
} }

View File

@@ -66,6 +66,14 @@ const scorm12 = {
basicMessage: 'Incorrect Data Type', basicMessage: 'Incorrect Data Type',
detailMessage: 'LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.', detailMessage: 'LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.',
}, },
'407': {
basicMessage: 'Element Value Out Of Range',
detailMessage: 'The numeric value supplied to a LMSSetValue call is outside of the numeric range allowed for the supplied data model element.',
},
'408': {
basicMessage: 'Data Model Dependency Not Established',
detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.',
},
}, },
}; };

View File

@@ -8,8 +8,8 @@ export class ValidationError extends Error {
* Constructor to take in an error message and code * Constructor to take in an error message and code
* @param {number} errorCode * @param {number} errorCode
*/ */
constructor(errorCode: number) { constructor(errorCode: number, ...rest) {
super(errorCode); super(...rest);
this.#errorCode = errorCode; this.#errorCode = errorCode;
} }
@@ -22,12 +22,4 @@ export class ValidationError extends Error {
get errorCode() { get errorCode() {
return this.#errorCode; return this.#errorCode;
} }
/**
* Trying to override the default Error message
* @return {string}
*/
get message() {
return this.#errorCode + '';
}
} }

View File

@@ -45,7 +45,7 @@ export const checkLMSSetValue = (
if (expectedError > 0) { if (expectedError > 0) {
if (errorThrown) { if (errorThrown) {
expect(() => api.lmsSetValue(fieldName, valueToTest)). expect(() => api.lmsSetValue(fieldName, valueToTest)).
to.throw(String(expectedError)); to.throw().with.property('errorCode', expectedError);
} else { } else {
api.lmsSetValue(fieldName, valueToTest); api.lmsSetValue(fieldName, valueToTest);
expect(String(api.lmsGetLastError())).to.equal(String(expectedError)); expect(String(api.lmsGetLastError())).to.equal(String(expectedError));
@@ -84,7 +84,7 @@ export const checkLMSGetValue = (
if (expectedError > 0) { if (expectedError > 0) {
if (errorThrown) { if (errorThrown) {
expect(() => api.lmsGetValue(fieldName)). expect(() => api.lmsGetValue(fieldName)).
to.throw(String(expectedError)); to.throw().with.property('errorCode', expectedError);
} else { } else {
api.lmsGetValue(fieldName); api.lmsGetValue(fieldName);
expect(String(api.lmsGetLastError())).to.equal(String(expectedError)); expect(String(api.lmsGetLastError())).to.equal(String(expectedError));
@@ -110,7 +110,7 @@ export const checkSetCMIValue = (
if (expectedError > 0) { if (expectedError > 0) {
if (errorThrown) { if (errorThrown) {
expect(() => api.setCMIValue(fieldName, valueToTest)). expect(() => api.setCMIValue(fieldName, valueToTest)).
to.throw(String(expectedError)); to.throw().with.property('errorCode', expectedError);
} else { } else {
api.setCMIValue(fieldName, valueToTest); api.setCMIValue(fieldName, valueToTest);
expect(String(api.lmsGetLastError())).to.equal(String(expectedError)); expect(String(api.lmsGetLastError())).to.equal(String(expectedError));

View File

@@ -23,7 +23,7 @@ export const checkFieldConstraintSize = (
it(`Should fail to write more than ${limit} characters to ${fieldName}`, it(`Should fail to write more than ${limit} characters to ${fieldName}`,
() => { () => {
expect(() => eval(`${fieldName} = 'x'.repeat(${limit + 1})`)). expect(() => eval(`${fieldName} = 'x'.repeat(${limit + 1})`)).
to.throw(expectedError + ''); to.throw().with.property('errorCode', expectedError);
}); });
}); });
}; };
@@ -42,7 +42,7 @@ export const checkReadOnly = (
it(`Should fail to write to ${fieldName}`, () => { it(`Should fail to write to ${fieldName}`, () => {
expect(() => eval(`${fieldName} = 'xxx'`)). expect(() => eval(`${fieldName} = 'xxx'`)).
to.throw(expectedError + ''); to.throw().with.property('errorCode', expectedError);
}); });
}); });
}; };
@@ -89,7 +89,7 @@ export const checkWriteOnly = (
describe(`Field: ${fieldName}`, () => { describe(`Field: ${fieldName}`, () => {
it(`Should fail to read from ${fieldName}`, () => { it(`Should fail to read from ${fieldName}`, () => {
expect(() => eval(`${fieldName}`)). expect(() => eval(`${fieldName}`)).
to.throw(expectedError + ''); to.throw().with.property('errorCode', expectedError);
}); });
it(`Should successfully write to ${fieldName}`, () => { it(`Should successfully write to ${fieldName}`, () => {

View File

@@ -5,12 +5,12 @@ import {ValidationError} from '../src/exceptions';
describe('Exception Tests', () => { describe('Exception Tests', () => {
it('ValidationException should return message string', () => { it('ValidationException should return message string', () => {
expect( expect(
new ValidationError(0).message, new ValidationError(0, 'Error Message').message,
).to.equal('0'); ).to.equal('Error Message');
}); });
it('ValidationException should return errorCode number', () => { it('ValidationException should return errorCode number', () => {
expect( expect(
new ValidationError(0).errorCode, new ValidationError(0, 'Error Message').errorCode,
).to.equal(0); ).to.equal(0);
}); });
}); });