"use strict";
define(["chai", "chai-jquery", "chai-backbone",
"../../../../../../src/js/models/metadata/eml211/EMLNonNumericDomain"],
function(chai, chaiJquery, chaiBackbone, EMLNonNumericDomain) {
// Configure the Chai assertion library
var should = chai.should();
var expect = chai.expect;
// Pull in Jquery and Backbone-specific assertion libraries
chai.use(chaiJquery); // exported from chai-jquery.js
chai.use(chaiBackbone); // exported from chai-backbone.js
describe("EMLNonNumericDomain Test Suite", function (){
var emlNonNumericDomain = new EMLNonNumericDomain();
var textDomainXML; // mock response from the server
var enumDomainCodeDefXML; // mock response from the server
var textDomainAttrs; // object returned by EMLNonNumericDomain.parse()
var enumDomainCodeDefAttrs; // object returned by EMLNonNumericDomain.parse()
/* Setup */
before(function() {
// Parse a nominal textDomain fragment
textDomainXML = NonNumericDomainUtil.getTestNominalTextDomainXML();
textDomainAttrs = emlNonNumericDomain.parse({
objectDOM: $(textDomainXML)[0],
objectXML: textDomainXML
});
// Parse an ordinal enumeratedDomain fragment
enumDomainCodeDefXML = NonNumericDomainUtil.getTestOrdinalEnumeratedCodeDefinitionDomainXML();
enumDomainCodeDefAttrs = emlNonNumericDomain.parse({
objectDOM: $(enumDomainCodeDefXML)[0],
objectXML: enumDomainCodeDefXML
});
});
/* Tear down */
after(function() {
textDomainXML = undefined;
textDomainAttrs = undefined;
enumDomainCodeDefXML = undefined;
enumDomainCodeDefAttrs = undefined;
});
describe("The EMLNonNumericDomain object", function() {
it('should exist', function() {
expect(emlNonNumericDomain).to.exist;
emlNonNumericDomain.should.exist;
});
});
describe("For a nominal scale with a text domain, .parse()", function() {
it("should return an attributes object", function() {
textDomainAttrs.should.be.an("object");
});
it("should return a nonNumericDomain array", function() {
textDomainAttrs.nonNumericDomain.should.be.an("array");
textDomainAttrs.nonNumericDomain.length.should.equal(1);
textDomainAttrs.nonNumericDomain[0].should.have.all.keys("textDomain");
});
it("should return a textDomain object", function() {
textDomainAttrs.nonNumericDomain[0].textDomain.should.be.an("object");
textDomainAttrs.nonNumericDomain[0].textDomain.should.have.all.keys("xmlID", "definition", "pattern", "source");
});
it("should return a textDomain definition string", function() {
textDomainAttrs.nonNumericDomain[0].textDomain.definition.should.be.a("string");
textDomainAttrs.nonNumericDomain[0].textDomain.definition.should.equal("Any text");
});
it("should return a textDomain pattern array", function() {
textDomainAttrs.nonNumericDomain[0].textDomain.pattern.should.be.an("array");
textDomainAttrs.nonNumericDomain[0].textDomain.pattern.length.should.equal(1);
textDomainAttrs.nonNumericDomain[0].textDomain.pattern[0].should.equal("*");
// TODO: test other regex patterns
});
it("should return a textDomain source string", function() {
textDomainAttrs.nonNumericDomain[0].textDomain.source.should.be.a("string");
textDomainAttrs.nonNumericDomain[0].textDomain.source.should.equal("Any source");
});
});
describe("For a nominal scale with a text domain, updateDOM()", function() {
var emlNonNumericDomain;
var updatedDOM;
var options;
var nonNumericDomain;
var textDomain;
/* Set up */
before(function() {
emlNonNumericDomain = new EMLNonNumericDomain({
measurementScale: "nominal",
objectDOM: $(NonNumericDomainUtil.getTestNominalTextDomainXML())
}, {parse: true});
options = {silent: true};
nonNumericDomain = emlNonNumericDomain.get("nonNumericDomain");
textDomain = nonNumericDomain[0].textDomain;
textDomain.definition = "Another definition";
textDomain.pattern[0] = "{0-9}{0-9}{0-9}";
textDomain.source = "Another source";
nonNumericDomain[0].textDomain = textDomain;
emlNonNumericDomain.set("nonNumericDomain", nonNumericDomain);
updatedDOM = emlNonNumericDomain.updateDOM();
});
/* Tear down*/
after(function() {
emlNonNumericDomain = undefined;
nonNumericDomain = undefined;
updatedDOM = undefined;
});
it("should return a modified text domain definition and pattern", function() {
$(updatedDOM).children("nonNumericDomain").children("textdomain").attr("id").should.equal("12345");
$(updatedDOM).children("nonNumericDomain").children("textdomain").children("definition")[0].textContent.should.equal("Another definition");
$(updatedDOM).children("nonNumericDomain").children("textdomain").children("pattern")[0].textContent.should.equal("{0-9}{0-9}{0-9}");
});
});
describe("For an ordinal scale with an enumerated domain code definition, .parse()", function() {
it("should return an attributes object", function() {
enumDomainCodeDefAttrs.should.be.an("object");
});
it("should return a nonNumericDomain object", function() {
enumDomainCodeDefAttrs.nonNumericDomain.should.be.an("array");
enumDomainCodeDefAttrs.nonNumericDomain.length.should.equal(1);
enumDomainCodeDefAttrs.nonNumericDomain[0].should.have.all.keys("enumeratedDomain");
});
it("should return an enumeratedDomain object", function() {
enumDomainCodeDefAttrs.nonNumericDomain[0].enumeratedDomain.should.be.an("object");
enumDomainCodeDefAttrs.nonNumericDomain[0].enumeratedDomain.should.have.all.keys("codeDefinition", "xmlID");
});
it("should return an enumeratedDomain codeDefinition array ", function() {
enumDomainCodeDefAttrs.nonNumericDomain[0].enumeratedDomain.codeDefinition.should.be.an("array");
enumDomainCodeDefAttrs.nonNumericDomain[0].enumeratedDomain.codeDefinition.length.should.equal(2);
enumDomainCodeDefAttrs.nonNumericDomain[0].enumeratedDomain.codeDefinition[0].should.be.an("object");
enumDomainCodeDefAttrs.nonNumericDomain[0].enumeratedDomain.codeDefinition[0].should.have.all.keys("code", "definition", "source");
enumDomainCodeDefAttrs.nonNumericDomain[0].enumeratedDomain.codeDefinition[0].code.should.equal("JAL");
enumDomainCodeDefAttrs.nonNumericDomain[0].enumeratedDomain.codeDefinition[0].definition.should.equal("Jalama Beach, California");
enumDomainCodeDefAttrs.nonNumericDomain[0].enumeratedDomain.codeDefinition[0].source.should.equal("USGS Place Name Gazateer");
enumDomainCodeDefAttrs.nonNumericDomain[0].enumeratedDomain.codeDefinition[1].code.should.equal("ALE");
enumDomainCodeDefAttrs.nonNumericDomain[0].enumeratedDomain.codeDefinition[1].definition.should.equal("Alegria, California");
expect(enumDomainCodeDefAttrs.nonNumericDomain[0].enumeratedDomain.codeDefinition[1].source).to.not.exist;
});
});
});
var NonNumericDomainUtil = {
/* Returns a nominal non-numeric text domain fragment */
getTestNominalTextDomainXML: function() {
var xml = [];
xml.push(
"\n",
"\t\n",
"\t\t\n",
"\t\t\tAny text\n",
"\t\t\t*\n",
"\t\t\tAny source\n",
"\t\t\n",
"\t\n",
"\n");
return xml.join('');
},
/* Returns an ordinal non-numeric enumerated domain fragment */
getTestOrdinalEnumeratedCodeDefinitionDomainXML: function() {
var xml = [];
xml.push(
"\n",
"\t\n",
"\t\t\n",
"\t\t\t\n",
"\t\t\t\tJAL
\n",
"\t\t\t\tJalama Beach, California\n",
"\t\t\t\tUSGS Place Name Gazateer\n",
"\t\t\t\n",
"\t\t\t\n",
"\t\t\t\tALE
\n",
"\t\t\t\tAlegria, California\n",
"\t\t\t\t\n",
"\t\t\t\n",
"\t\t\n",
"\t\n",
"\n");
return xml.join('');
}
}
});