added tests for new xml type.
This commit is contained in:
parent
3ba89edf7d
commit
9a8f8fba05
@ -54,6 +54,11 @@ YList = (function() {
|
|||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
YList.prototype.push = function(content) {
|
||||||
|
this._model.push(content);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
return YList;
|
return YList;
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
@ -1,21 +1,12 @@
|
|||||||
var YXml;
|
var YXml;
|
||||||
|
|
||||||
YXml = (function() {
|
YXml = (function() {
|
||||||
function YXml(tagname, attributes, children, classes) {
|
function YXml(tagname, attributes) {
|
||||||
var a, a_name, c, c_name, _classes, _i, _len, _ref;
|
var a, a_name, c, c_name, _classes, _i, _len, _ref;
|
||||||
if (attributes == null) {
|
if (attributes == null) {
|
||||||
attributes = {};
|
attributes = {};
|
||||||
}
|
}
|
||||||
if (children == null) {
|
|
||||||
children = [];
|
|
||||||
}
|
|
||||||
if (classes == null) {
|
|
||||||
classes = {};
|
|
||||||
}
|
|
||||||
this._xml = {};
|
this._xml = {};
|
||||||
if (tagname == null) {
|
|
||||||
throw new Error("You must specify a tagname");
|
|
||||||
}
|
|
||||||
this._xml.tagname = tagname;
|
this._xml.tagname = tagname;
|
||||||
if (attributes.constructor !== Object) {
|
if (attributes.constructor !== Object) {
|
||||||
throw new Error("The attributes must be specified as a Object");
|
throw new Error("The attributes must be specified as a Object");
|
||||||
@ -27,10 +18,7 @@ YXml = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
this._xml.attributes = attributes;
|
this._xml.attributes = attributes;
|
||||||
if (classes.constructor !== Object) {
|
this._xml.classes = {};
|
||||||
throw new Error("The classes must be specified as an Array");
|
|
||||||
}
|
|
||||||
this._xml.classes = classes;
|
|
||||||
_classes = this._xml.attributes["class"];
|
_classes = this._xml.attributes["class"];
|
||||||
delete this._xml.attributes["class"];
|
delete this._xml.attributes["class"];
|
||||||
if (_classes != null) {
|
if (_classes != null) {
|
||||||
@ -42,17 +30,18 @@ YXml = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (children.constructor !== Array) {
|
void 0;
|
||||||
throw new Error("You must specify the children as an Array that contains Strings and Y.Xml objects only");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
YXml.prototype._name = "Xml";
|
YXml.prototype._name = "Xml";
|
||||||
|
|
||||||
YXml.prototype._getModel = function(types, ops) {
|
YXml.prototype._getModel = function(Y, ops) {
|
||||||
if (this._model == null) {
|
if (this._model == null) {
|
||||||
this._model = new ops.MapManager(this).execute();
|
this._model = new ops.MapManager(this).execute();
|
||||||
this._model.val("attributes", new Y.Object(this._xml.attributes)).val("classes", new Y.Object(this._xml.classes)).val("tagname", this._xml.tagname).val("children", this._xml.children);
|
this._model.val("attributes", new Y.Object(this._xml.attributes));
|
||||||
|
this._model.val("classes", new Y.Object(this._xml.classes));
|
||||||
|
this._model.val("tagname", this._xml.tagname);
|
||||||
|
this._model.val("children", new Y.List());
|
||||||
}
|
}
|
||||||
delete this._xml;
|
delete this._xml;
|
||||||
return this._model;
|
return this._model;
|
||||||
@ -63,29 +52,232 @@ YXml = (function() {
|
|||||||
return delete this._xml;
|
return delete this._xml;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
YXml.prototype._setParent = function(parent) {
|
||||||
|
if (parent instanceof YXml) {
|
||||||
|
this.remove();
|
||||||
|
return this._model.val("parent", parent);
|
||||||
|
} else {
|
||||||
|
throw new Error("parent must be of type Y.Xml!");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
YXml.prototype.toString = function() {
|
||||||
|
var child, name, value, xml, _i, _len, _ref, _ref1;
|
||||||
|
xml = "<" + this._model.val("tagname");
|
||||||
|
_ref = this.attr();
|
||||||
|
for (name in _ref) {
|
||||||
|
value = _ref[name];
|
||||||
|
xml += " " + name + '="' + value + '"';
|
||||||
|
}
|
||||||
|
xml += ">";
|
||||||
|
_ref1 = this._model.val("children").val();
|
||||||
|
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
||||||
|
child = _ref1[_i];
|
||||||
|
xml += child.toString();
|
||||||
|
}
|
||||||
|
xml += '</' + this._model.val("tagname") + '>';
|
||||||
|
return xml;
|
||||||
|
};
|
||||||
|
|
||||||
YXml.prototype.attr = function(name, value) {
|
YXml.prototype.attr = function(name, value) {
|
||||||
|
var attrs, classes;
|
||||||
if (arguments.length > 1) {
|
if (arguments.length > 1) {
|
||||||
if (value.constructor !== Strings) {
|
if (value.constructor !== String) {
|
||||||
throw new Error("The attributes must be of type String!");
|
throw new Error("The attributes must be of type String!");
|
||||||
}
|
}
|
||||||
this._model.val("attributes").val(name, value);
|
this._model.val("attributes").val(name, value);
|
||||||
return this;
|
return this;
|
||||||
} else if (arguments.length > 0) {
|
} else if (arguments.length > 0) {
|
||||||
return this._model.val("attributes").val(name);
|
if (name === "class") {
|
||||||
|
return Object.keys(this._model.val("classes").val()).join(" ");
|
||||||
|
} else {
|
||||||
|
return this._model.val("attributes").val(name);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return this._model.val("attributes").val();
|
attrs = this._model.val("attributes").val();
|
||||||
|
classes = Object.keys(this._model.val("classes").val()).join(" ");
|
||||||
|
if (classes.length > 0) {
|
||||||
|
attrs["class"] = classes;
|
||||||
|
}
|
||||||
|
return attrs;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
YXml.prototype.addClass = function(name) {
|
YXml.prototype.addClass = function(names) {
|
||||||
this._model.val("classes").val(name, true);
|
var name, _i, _len, _ref;
|
||||||
|
_ref = names.split(" ");
|
||||||
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||||
|
name = _ref[_i];
|
||||||
|
this._model.val("classes").val(name, true);
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
YXml.prototype.removeClass = function(name) {
|
YXml.prototype.after = function() {
|
||||||
return this._model.val("classes")["delete"](name);
|
var c, content, contents, parent, position, _i, _j, _len, _len1, _ref;
|
||||||
|
parent = this._model.val("parent");
|
||||||
|
if (parent == null) {
|
||||||
|
throw new Error("This Xml Element must not have siblings! (for it does not have a parent)");
|
||||||
|
}
|
||||||
|
_ref = parent.val("children").val();
|
||||||
|
for (position = _i = 0, _len = _ref.length; _i < _len; position = ++_i) {
|
||||||
|
c = _ref[position];
|
||||||
|
if (c === this) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
contents = [];
|
||||||
|
for (_j = 0, _len1 = arguments.length; _j < _len1; _j++) {
|
||||||
|
content = arguments[_j];
|
||||||
|
if (!(content instanceof YXml || content.constructor === String)) {
|
||||||
|
throw new Error("Y.Xml.after expects instances of YXml or String as a parameter");
|
||||||
|
}
|
||||||
|
contents.push(content);
|
||||||
|
}
|
||||||
|
return parent._model.val("children").insert(position + 1, contents);
|
||||||
|
};
|
||||||
|
|
||||||
|
YXml.prototype.append = function() {
|
||||||
|
var content, contents, _i, _len;
|
||||||
|
contents = [];
|
||||||
|
for (_i = 0, _len = arguments.length; _i < _len; _i++) {
|
||||||
|
content = arguments[_i];
|
||||||
|
if (!(content instanceof YXml || content.constructor === String)) {
|
||||||
|
throw new Error("Y.Xml.after expects instances of YXml or String as a parameter");
|
||||||
|
}
|
||||||
|
contents.push(content);
|
||||||
|
}
|
||||||
|
return this._model.val("children").push(contents);
|
||||||
|
};
|
||||||
|
|
||||||
|
YXml.prototype.before = function() {
|
||||||
|
var c, content, contents, parent, position, _i, _j, _len, _len1, _ref;
|
||||||
|
parent = this._model.val("parent");
|
||||||
|
if (parent == null) {
|
||||||
|
throw new Error("This Xml Element must not have siblings! (for it does not have a parent)");
|
||||||
|
}
|
||||||
|
_ref = parent.val("children").val();
|
||||||
|
for (position = _i = 0, _len = _ref.length; _i < _len; position = ++_i) {
|
||||||
|
c = _ref[position];
|
||||||
|
if (c === this) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
contents = [];
|
||||||
|
for (_j = 0, _len1 = arguments.length; _j < _len1; _j++) {
|
||||||
|
content = arguments[_j];
|
||||||
|
if (!(content instanceof YXml || content.constructor === String)) {
|
||||||
|
throw new Error("Y.Xml.after expects instances of YXml or String as a parameter");
|
||||||
|
}
|
||||||
|
contents.push(content);
|
||||||
|
}
|
||||||
|
return parent._model.val("children").insert(position, contents);
|
||||||
|
};
|
||||||
|
|
||||||
|
YXml.prototype.empty = function() {
|
||||||
|
var child, _i, _len, _ref, _results;
|
||||||
|
_ref = this._model.val("children").val();
|
||||||
|
_results = [];
|
||||||
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||||
|
child = _ref[_i];
|
||||||
|
_results.push(child.remove());
|
||||||
|
}
|
||||||
|
return _results;
|
||||||
|
};
|
||||||
|
|
||||||
|
YXml.prototype.hasClass = function(className) {
|
||||||
|
if (this._model.val("classes").val(className) != null) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
YXml.prototype.prepend = function() {
|
||||||
|
var content, contents, _i, _len;
|
||||||
|
contents = [];
|
||||||
|
for (_i = 0, _len = arguments.length; _i < _len; _i++) {
|
||||||
|
content = arguments[_i];
|
||||||
|
if (!(content instanceof YXml || content.constructor === String)) {
|
||||||
|
throw new Error("Y.Xml.after expects instances of YXml or String as a parameter");
|
||||||
|
}
|
||||||
|
contents.push(content);
|
||||||
|
}
|
||||||
|
return this._model.val("children").insert(0, contents);
|
||||||
|
};
|
||||||
|
|
||||||
|
YXml.prototype.remove = function() {
|
||||||
|
var c, i, parent, _i, _len, _ref;
|
||||||
|
parent = this._model.val("parent");
|
||||||
|
if (parent instanceof YXml) {
|
||||||
|
_ref = parent.getChildren();
|
||||||
|
for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
|
||||||
|
c = _ref[i];
|
||||||
|
if (c === this) {
|
||||||
|
parent._model["delete"](i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return void 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
YXml.prototype.removeAttr = function(attrName) {
|
||||||
|
if (attrName === "class") {
|
||||||
|
this._model.val("classes", new Y.Object());
|
||||||
|
} else {
|
||||||
|
this._model.val("attributes")["delete"](attrName);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
YXml.prototype.removeClass = function() {
|
||||||
|
var className, _i, _len;
|
||||||
|
if (arguments.length === 0) {
|
||||||
|
this._model.val("classes", new Y.Object());
|
||||||
|
} else {
|
||||||
|
for (_i = 0, _len = arguments.length; _i < _len; _i++) {
|
||||||
|
className = arguments[_i];
|
||||||
|
this._model.val("classes")["delete"](className);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
YXml.prototype.toggleClass = function() {
|
||||||
|
var className, classes, _i, _len;
|
||||||
|
for (_i = 0, _len = arguments.length; _i < _len; _i++) {
|
||||||
|
className = arguments[_i];
|
||||||
|
classes = this._model.val("classes");
|
||||||
|
if (classes.val(className) != null) {
|
||||||
|
classes["delete"](className);
|
||||||
|
} else {
|
||||||
|
classes.val(className, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
YXml.prototype.getParent = function() {
|
||||||
|
return this._model.val("parent");
|
||||||
|
};
|
||||||
|
|
||||||
|
YXml.prototype.getChildren = function() {
|
||||||
|
return this._model.val("children").val();
|
||||||
};
|
};
|
||||||
|
|
||||||
return YXml;
|
return YXml;
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
if (typeof window !== "undefined" && window !== null) {
|
||||||
|
if (window.Y != null) {
|
||||||
|
window.Y.Xml = YXml;
|
||||||
|
} else {
|
||||||
|
throw new Error("You must first import Y!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof module !== "undefined" && module !== null) {
|
||||||
|
module.exports = YXml;
|
||||||
|
}
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
16641
build/test/Xml_test.js
Normal file
16641
build/test/Xml_test.js
Normal file
File diff suppressed because one or more lines are too long
@ -13,8 +13,9 @@
|
|||||||
mocha.ui('bdd');
|
mocha.ui('bdd');
|
||||||
mocha.reporter('html');
|
mocha.reporter('html');
|
||||||
</script>
|
</script>
|
||||||
<script src="Text_test.js"></script>
|
<script src="Xml_test.js"></script>
|
||||||
<script src="Json_test.js"></script>
|
<!--script src="Text_test.js"></script>
|
||||||
|
<script src="Json_test.js"></script-->
|
||||||
<!--script src="Xml_test_browser.js"></script-->
|
<!--script src="Xml_test_browser.js"></script-->
|
||||||
<script>
|
<script>
|
||||||
//mocha.checkLeaks();
|
//mocha.checkLeaks();
|
||||||
|
@ -25,8 +25,8 @@ gulp.task 'default', ['build_browser']
|
|||||||
files =
|
files =
|
||||||
lib : ['./lib/**/*.coffee']
|
lib : ['./lib/**/*.coffee']
|
||||||
browser : ['./lib/y.coffee','./lib/y-object.coffee']
|
browser : ['./lib/y.coffee','./lib/y-object.coffee']
|
||||||
#test : ['./test/**/*_test.coffee']
|
test : ['./test/**/*_test.coffee']
|
||||||
test : ['./test/Json_test.coffee', './test/Text_test.coffee']
|
#test : ['./test/Json_test.coffee', './test/Text_test.coffee']
|
||||||
gulp : ['./gulpfile.coffee']
|
gulp : ['./gulpfile.coffee']
|
||||||
examples : ['./examples/**/*.js']
|
examples : ['./examples/**/*.js']
|
||||||
other: ['./lib/**/*', './test/*']
|
other: ['./lib/**/*', './test/*']
|
||||||
|
@ -50,6 +50,10 @@ class YList
|
|||||||
@_model.delete position, length
|
@_model.delete position, length
|
||||||
@
|
@
|
||||||
|
|
||||||
|
push: (content)->
|
||||||
|
@_model.push content
|
||||||
|
@
|
||||||
|
|
||||||
if window?
|
if window?
|
||||||
if window.Y?
|
if window.Y?
|
||||||
window.Y.List = YList
|
window.Y.List = YList
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
class YXml
|
class YXml
|
||||||
|
|
||||||
constructor: (tagname, attributes = {}, children = [], classes = {})->
|
constructor: (tagname, attributes = {})->
|
||||||
@_xml = {}
|
@_xml = {}
|
||||||
if not tagname?
|
#TODO: How to force the user to specify parameters?
|
||||||
throw new Error "You must specify a tagname"
|
#if not tagname?
|
||||||
|
# throw new Error "You must specify a tagname"
|
||||||
@_xml.tagname = tagname
|
@_xml.tagname = tagname
|
||||||
if attributes.constructor isnt Object
|
if attributes.constructor isnt Object
|
||||||
throw new Error "The attributes must be specified as a Object"
|
throw new Error "The attributes must be specified as a Object"
|
||||||
@ -11,53 +12,246 @@ class YXml
|
|||||||
if a.constructor isnt String
|
if a.constructor isnt String
|
||||||
throw new Error "The attributes must be of type String!"
|
throw new Error "The attributes must be of type String!"
|
||||||
@_xml.attributes = attributes
|
@_xml.attributes = attributes
|
||||||
if classes.constructor isnt Object
|
@_xml.classes = {}
|
||||||
throw new Error "The classes must be specified as an Array"
|
|
||||||
@_xml.classes = classes
|
|
||||||
_classes = @_xml.attributes.class
|
_classes = @_xml.attributes.class
|
||||||
delete @_xml.attributes.class
|
delete @_xml.attributes.class
|
||||||
if _classes?
|
if _classes?
|
||||||
for c_name, c in _classes.split(" ")
|
for c_name, c in _classes.split(" ")
|
||||||
if c.length > 0
|
if c.length > 0
|
||||||
@_xml.classes[c_name] = c
|
@_xml.classes[c_name] = c
|
||||||
if children.constructor isnt Array
|
undefined
|
||||||
throw new Error "You must specify the children as an Array that contains Strings and Y.Xml objects only"
|
|
||||||
|
|
||||||
_name: "Xml"
|
_name: "Xml"
|
||||||
|
|
||||||
_getModel: (types, ops)->
|
_getModel: (Y, ops)->
|
||||||
if not @_model?
|
if not @_model?
|
||||||
@_model = new ops.MapManager(@).execute()
|
@_model = new ops.MapManager(@).execute()
|
||||||
@_model.val("attributes", new Y.Object(@_xml.attributes))
|
@_model.val("attributes", new Y.Object(@_xml.attributes))
|
||||||
.val("classes", new Y.Object(@_xml.classes))
|
@_model.val("classes", new Y.Object(@_xml.classes))
|
||||||
.val("tagname", @_xml.tagname)
|
@_model.val("tagname", @_xml.tagname)
|
||||||
.val("children", @_xml.children)
|
@_model.val("children", new Y.List())
|
||||||
|
|
||||||
delete @_xml
|
delete @_xml
|
||||||
@_model
|
@_model
|
||||||
|
|
||||||
_setModel: (@_model)->
|
_setModel: (@_model)->
|
||||||
delete @_xml
|
delete @_xml
|
||||||
|
|
||||||
|
_setParent: (parent)->
|
||||||
|
if parent instanceof YXml
|
||||||
|
@remove()
|
||||||
|
@_model.val("parent", parent)
|
||||||
|
else
|
||||||
|
throw new Error "parent must be of type Y.Xml!"
|
||||||
|
|
||||||
|
toString: ()->
|
||||||
|
xml = "<"+@_model.val("tagname")
|
||||||
|
for name, value of @attr()
|
||||||
|
xml += " "+name+'="'+value+'"'
|
||||||
|
xml += ">"
|
||||||
|
for child in @_model.val("children").val()
|
||||||
|
xml += child.toString()
|
||||||
|
xml += '</'+@_model.val("tagname")+'>'
|
||||||
|
xml
|
||||||
|
|
||||||
|
#
|
||||||
|
# Get/set the attribute(s) of this element.
|
||||||
|
# .attr()
|
||||||
|
# .attr(name)
|
||||||
|
# .attr(name, value)
|
||||||
|
#
|
||||||
attr: (name, value)->
|
attr: (name, value)->
|
||||||
if arguments.length > 1
|
if arguments.length > 1
|
||||||
if value.constructor isnt Strings
|
if value.constructor isnt String
|
||||||
throw new Error "The attributes must be of type String!"
|
throw new Error "The attributes must be of type String!"
|
||||||
@_model.val("attributes").val(name, value)
|
@_model.val("attributes").val(name, value)
|
||||||
@
|
@
|
||||||
else if arguments.length > 0
|
else if arguments.length > 0
|
||||||
@_model.val("attributes").val(name)
|
if name is "class"
|
||||||
|
Object.keys(@_model.val("classes").val()).join(" ")
|
||||||
|
else
|
||||||
|
@_model.val("attributes").val(name)
|
||||||
else
|
else
|
||||||
@_model.val("attributes").val()
|
attrs = @_model.val("attributes").val()
|
||||||
|
classes = Object.keys(@_model.val("classes").val()).join(" ")
|
||||||
|
if classes.length > 0
|
||||||
|
attrs["class"] = classes
|
||||||
|
attrs
|
||||||
|
|
||||||
addClass: (name)->
|
#
|
||||||
@_model.val("classes").val(name, true)
|
# Adds the specified class(es) to this element
|
||||||
|
#
|
||||||
|
addClass: (names)->
|
||||||
|
for name in names.split(" ")
|
||||||
|
@_model.val("classes").val(name, true)
|
||||||
@
|
@
|
||||||
|
|
||||||
removeClass: (name)->
|
#
|
||||||
@_model.val("classes").delete(name)
|
# Insert content, specified by the parameter, after this element
|
||||||
|
# .after(content [, content])
|
||||||
|
#
|
||||||
|
after: ()->
|
||||||
|
parent = @_model.val("parent")
|
||||||
|
if not parent?
|
||||||
|
throw new Error "This Xml Element must not have siblings! (for it does not have a parent)"
|
||||||
|
|
||||||
|
# find the position of this element
|
||||||
|
for c,position in parent.val("children").val()
|
||||||
|
if c is @
|
||||||
|
break
|
||||||
|
|
||||||
|
contents = []
|
||||||
|
for content in arguments
|
||||||
|
if not (content instanceof YXml or content.constructor is String)
|
||||||
|
throw new Error "Y.Xml.after expects instances of YXml or String as a parameter"
|
||||||
|
contents.push content
|
||||||
|
|
||||||
|
parent._model.val("children").insert(position+1, contents)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Insert content, specified by the parameter, to the end of this element
|
||||||
|
# .append(content [, content])
|
||||||
|
#
|
||||||
|
append: ()->
|
||||||
|
contents = []
|
||||||
|
for content in arguments
|
||||||
|
if not (content instanceof YXml or content.constructor is String)
|
||||||
|
throw new Error "Y.Xml.after expects instances of YXml or String as a parameter"
|
||||||
|
contents.push content
|
||||||
|
|
||||||
|
@_model.val("children").push(contents)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Insert content, specified by the parameter, after this element
|
||||||
|
# .after(content [, content])
|
||||||
|
#
|
||||||
|
before: ()->
|
||||||
|
parent = @_model.val("parent")
|
||||||
|
if not parent?
|
||||||
|
throw new Error "This Xml Element must not have siblings! (for it does not have a parent)"
|
||||||
|
|
||||||
|
# find the position of this element
|
||||||
|
for c,position in parent.val("children").val()
|
||||||
|
if c is @
|
||||||
|
break
|
||||||
|
|
||||||
|
contents = []
|
||||||
|
for content in arguments
|
||||||
|
if not (content instanceof YXml or content.constructor is String)
|
||||||
|
throw new Error "Y.Xml.after expects instances of YXml or String as a parameter"
|
||||||
|
contents.push content
|
||||||
|
|
||||||
|
parent._model.val("children").insert(position, contents)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Remove all child nodes of the set of matched elements from the DOM.
|
||||||
|
# .empty()
|
||||||
|
#
|
||||||
|
empty: ()->
|
||||||
|
for child in @_model.val("children").val()
|
||||||
|
child.remove()
|
||||||
|
|
||||||
|
#
|
||||||
|
# Determine whether any of the matched elements are assigned the given class.
|
||||||
|
# .hasClass(className)
|
||||||
|
#
|
||||||
|
hasClass: (className)->
|
||||||
|
if @_model.val("classes").val(className)?
|
||||||
|
true
|
||||||
|
else
|
||||||
|
false
|
||||||
|
|
||||||
|
#
|
||||||
|
# Insert content, specified by the parameter, to the beginning of this element.
|
||||||
|
# .prepend(content [, content])
|
||||||
|
#
|
||||||
|
prepend: ()->
|
||||||
|
contents = []
|
||||||
|
for content in arguments
|
||||||
|
if not (content instanceof YXml or content.constructor is String)
|
||||||
|
throw new Error "Y.Xml.after expects instances of YXml or String as a parameter"
|
||||||
|
contents.push content
|
||||||
|
|
||||||
|
@_model.val("children").insert(0, contents)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Remove this element from the DOM
|
||||||
|
# .remove()
|
||||||
|
#
|
||||||
|
remove: ()->
|
||||||
|
parent = @_model.val("parent")
|
||||||
|
if parent instanceof YXml
|
||||||
|
for c,i in parent.getChildren()
|
||||||
|
if c is @
|
||||||
|
parent._model.delete i
|
||||||
|
break
|
||||||
|
undefined
|
||||||
|
|
||||||
|
#
|
||||||
|
# Remove an attribute from this element
|
||||||
|
# .removeAttr(attrName)
|
||||||
|
#
|
||||||
|
removeAttr: (attrName)->
|
||||||
|
if attrName is "class"
|
||||||
|
@_model.val("classes", new Y.Object())
|
||||||
|
else
|
||||||
|
@_model.val("attributes").delete(attrName)
|
||||||
|
@
|
||||||
|
|
||||||
|
#
|
||||||
|
# Remove a single class, multiple classes, or all classes from this element
|
||||||
|
# .removeClass([className])
|
||||||
|
#
|
||||||
|
removeClass: ()->
|
||||||
|
if arguments.length is 0
|
||||||
|
@_model.val("classes", new Y.Object())
|
||||||
|
else
|
||||||
|
for className in arguments
|
||||||
|
@_model.val("classes").delete(className)
|
||||||
|
@
|
||||||
|
|
||||||
|
#
|
||||||
|
# Add or remove one or more classes from this element,
|
||||||
|
# depending on either the class’s presence or the value of the state argument.
|
||||||
|
# .toggleClass([className])
|
||||||
|
#
|
||||||
|
toggleClass: ()->
|
||||||
|
for className in arguments
|
||||||
|
classes = @_model.val("classes")
|
||||||
|
if classes.val(className)?
|
||||||
|
classes.delete(className)
|
||||||
|
else
|
||||||
|
classes.val(className, true)
|
||||||
|
@
|
||||||
|
|
||||||
|
#
|
||||||
|
# Get the parent of this Element
|
||||||
|
# @Note: Every XML element can only have one parent
|
||||||
|
# .getParent()
|
||||||
|
#
|
||||||
|
getParent: ()->
|
||||||
|
@_model.val("parent")
|
||||||
|
|
||||||
|
#
|
||||||
|
# Get all the children of this XML Element as an Array
|
||||||
|
# @Note: The children are either of type Y.Xml or String
|
||||||
|
# .getChildren()
|
||||||
|
#
|
||||||
|
getChildren: ()->
|
||||||
|
@_model.val("children").val()
|
||||||
|
|
||||||
|
|
||||||
|
if window?
|
||||||
|
if window.Y?
|
||||||
|
window.Y.Xml = YXml
|
||||||
|
else
|
||||||
|
throw new Error "You must first import Y!"
|
||||||
|
|
||||||
|
if module?
|
||||||
|
module.exports = YXml
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,8 +7,8 @@ _ = require("underscore")
|
|||||||
|
|
||||||
chai.use(sinonChai)
|
chai.use(sinonChai)
|
||||||
|
|
||||||
Connector = require "../../y-test/lib/y-test.coffee"
|
|
||||||
Y = require "../lib/y.coffee"
|
Y = require "../lib/y.coffee"
|
||||||
|
Y.Test = require "../../y-test/lib/y-test.coffee"
|
||||||
Y.Text = require "../lib/Types/Text"
|
Y.Text = require "../lib/Types/Text"
|
||||||
Y.List = require "../lib/Types/List"
|
Y.List = require "../lib/Types/List"
|
||||||
|
|
||||||
@ -20,14 +20,13 @@ class JsonTest extends Test
|
|||||||
super suffix, Y
|
super suffix, Y
|
||||||
|
|
||||||
makeNewUser: (userId)->
|
makeNewUser: (userId)->
|
||||||
conn = new Connector userId
|
conn = new Y.Test userId
|
||||||
super new Y conn
|
super new Y conn
|
||||||
|
|
||||||
type: "JsonTest"
|
type: "JsonTest"
|
||||||
|
|
||||||
getRandomRoot: (user_num, root, depth = @max_depth)->
|
getRandomRoot: (user_num, root, depth = @max_depth)->
|
||||||
root ?= @users[user_num]
|
root ?= @users[user_num]
|
||||||
types = @users[user_num].types
|
|
||||||
if depth is 0 or _.random(0,1) is 1 # take root
|
if depth is 0 or _.random(0,1) is 1 # take root
|
||||||
root
|
root
|
||||||
else # take child
|
else # take child
|
||||||
|
@ -14,7 +14,7 @@ module.exports = class Test
|
|||||||
Y = Yjs
|
Y = Yjs
|
||||||
@number_of_test_cases_multiplier = 1
|
@number_of_test_cases_multiplier = 1
|
||||||
@repeat_this = 1 * @number_of_test_cases_multiplier
|
@repeat_this = 1 * @number_of_test_cases_multiplier
|
||||||
@doSomething_amount = 1230 * @number_of_test_cases_multiplier
|
@doSomething_amount = 123 * @number_of_test_cases_multiplier
|
||||||
@number_of_engines = 5 + @number_of_test_cases_multiplier - 1
|
@number_of_engines = 5 + @number_of_test_cases_multiplier - 1
|
||||||
|
|
||||||
@time = 0 # denotes to the time when run was started
|
@time = 0 # denotes to the time when run was started
|
||||||
@ -95,15 +95,12 @@ module.exports = class Test
|
|||||||
getRandomRoot: (user_num)->
|
getRandomRoot: (user_num)->
|
||||||
throw new Error "implement me!"
|
throw new Error "implement me!"
|
||||||
|
|
||||||
getContent: (user_num)->
|
|
||||||
throw new Error "implement me!"
|
|
||||||
|
|
||||||
compare: (o1, o2, depth = (@max_depth+1))->
|
compare: (o1, o2, depth = (@max_depth+1))->
|
||||||
if o1 is o2 or depth <= 0
|
if o1 is o2 or depth <= 0
|
||||||
true
|
true
|
||||||
else if o1._name? and o1._name isnt o2._name
|
else if o1._name? and o1._name isnt o2._name
|
||||||
throw new Error "different types"
|
throw new Error "different types"
|
||||||
else if o1._name is "Object"
|
else if o1._name is "Object" or o1.type is "MapManager"
|
||||||
for name, val of o1.val()
|
for name, val of o1.val()
|
||||||
@compare(val, o2.val(name), depth-1)
|
@compare(val, o2.val(name), depth-1)
|
||||||
else if o1._name?
|
else if o1._name?
|
||||||
@ -115,6 +112,8 @@ module.exports = class Test
|
|||||||
@compare o, o2[i], (depth-1)
|
@compare o, o2[i], (depth-1)
|
||||||
else if o1 isnt o2
|
else if o1 isnt o2
|
||||||
throw new Error "different values"
|
throw new Error "different values"
|
||||||
|
else
|
||||||
|
throw new Error "I don't know what to do .. "
|
||||||
|
|
||||||
generateRandomOp: (user_num)=>
|
generateRandomOp: (user_num)=>
|
||||||
y = @getRandomRoot(user_num)
|
y = @getRandomRoot(user_num)
|
||||||
|
191
test/Xml_test.coffee
Normal file
191
test/Xml_test.coffee
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
chai = require('chai')
|
||||||
|
expect = chai.expect
|
||||||
|
should = chai.should()
|
||||||
|
sinon = require('sinon')
|
||||||
|
sinonChai = require('sinon-chai')
|
||||||
|
_ = require("underscore")
|
||||||
|
|
||||||
|
chai.use(sinonChai)
|
||||||
|
|
||||||
|
Y = require "../lib/y.coffee"
|
||||||
|
Y.Test = require "../../y-test/lib/y-test.coffee"
|
||||||
|
|
||||||
|
Y.List = require "../lib/Types/List"
|
||||||
|
Y.Xml = require "../lib/Types/Xml"
|
||||||
|
|
||||||
|
Test = require "./TestSuite"
|
||||||
|
|
||||||
|
class XmlTest extends Test
|
||||||
|
|
||||||
|
constructor: (suffix)->
|
||||||
|
super suffix, Y
|
||||||
|
|
||||||
|
makeNewUser: (userId)->
|
||||||
|
conn = new Y.Test userId
|
||||||
|
super new Y conn
|
||||||
|
|
||||||
|
initUsers: (u)->
|
||||||
|
u.val("xml",new Y.Xml("root"))
|
||||||
|
|
||||||
|
type: "XmlTest"
|
||||||
|
|
||||||
|
compare: (o1, o2)->
|
||||||
|
if o1.constructor is Y.Xml
|
||||||
|
@compare o1._model, o2._model
|
||||||
|
else
|
||||||
|
super
|
||||||
|
|
||||||
|
getRandomRoot: (user_num, root, depth = @max_depth)->
|
||||||
|
root ?= @users[user_num]
|
||||||
|
if depth is 0 or _.random(0,1) is 1 # take root
|
||||||
|
root
|
||||||
|
else # take child
|
||||||
|
depth--
|
||||||
|
elems = null
|
||||||
|
if root._name is "Xml"
|
||||||
|
elems = root.getChildren()
|
||||||
|
else
|
||||||
|
return root
|
||||||
|
|
||||||
|
elems = elems.filter (elem)->
|
||||||
|
elem._name is "Xml"
|
||||||
|
if elems.length is 0
|
||||||
|
root
|
||||||
|
else
|
||||||
|
p = elems[_.random(0, elems.length-1)]
|
||||||
|
@getRandomRoot user_num, p, depth
|
||||||
|
|
||||||
|
getGeneratingFunctions: (user_num)->
|
||||||
|
super(user_num).concat [
|
||||||
|
]
|
||||||
|
|
||||||
|
describe "Y-Xml", ->
|
||||||
|
@timeout 500000
|
||||||
|
|
||||||
|
beforeEach (done)->
|
||||||
|
@yTest = new XmlTest()
|
||||||
|
@users = @yTest.users
|
||||||
|
|
||||||
|
@u1 = @users[1].val("xml")
|
||||||
|
@u2 = @users[2].val("xml")
|
||||||
|
@u3 = @users[3].val("xml")
|
||||||
|
done()
|
||||||
|
|
||||||
|
###
|
||||||
|
it "can handle many engines, many operations, concurrently (random)", ->
|
||||||
|
console.log "" # TODO
|
||||||
|
@yTest.run()
|
||||||
|
|
||||||
|
it "has a working test suite", ->
|
||||||
|
@yTest.compareAll()
|
||||||
|
###
|
||||||
|
|
||||||
|
it "Create Xml Element", ->
|
||||||
|
@u1.attr("stuff", "true")
|
||||||
|
console.log(@u1.toString())
|
||||||
|
@yTest.compareAll()
|
||||||
|
|
||||||
|
describe "has method ", ->
|
||||||
|
it "attr", ->
|
||||||
|
@u1.attr("attr", "newAttr")
|
||||||
|
@u1.attr("other_attr", "newAttr")
|
||||||
|
@yTest.compareAll()
|
||||||
|
expect(@u2.attr("attr")).to.equal("newAttr")
|
||||||
|
expect(@u2.attr().other_attr).to.equal("newAttr")
|
||||||
|
|
||||||
|
it "addClass", ->
|
||||||
|
@u1.addClass("newClass")
|
||||||
|
@u2.addClass("otherClass")
|
||||||
|
@yTest.compareAll()
|
||||||
|
expect(@u1.attr("class")).to.equal("newClass otherClass") # 1 < 2 and therefore this is the proper order
|
||||||
|
|
||||||
|
|
||||||
|
it "append", ->
|
||||||
|
child = new Y.Xml("child")
|
||||||
|
child2 = new Y.Xml("child2")
|
||||||
|
@u1.append child
|
||||||
|
@u1.append child2
|
||||||
|
expect(@u1.toString()).to.equal("<root><child></child><child2></child2></root>")
|
||||||
|
@yTest.compareAll()
|
||||||
|
|
||||||
|
it "prepend", ->
|
||||||
|
child = new Y.Xml("child")
|
||||||
|
child2 = new Y.Xml("child2")
|
||||||
|
@u1.prepend child2
|
||||||
|
@u1.prepend child
|
||||||
|
expect(@u1.toString()).to.equal("<root><child></child><child2></child2></root>")
|
||||||
|
@yTest.compareAll()
|
||||||
|
|
||||||
|
it "after", ->
|
||||||
|
child = new Y.Xml("child")
|
||||||
|
@u1.append child
|
||||||
|
child.after new Y.Xml("right-child")
|
||||||
|
expect(@u1.toString()).to.equal("<root><child></child><right-child></right-child></root>")
|
||||||
|
@yTest.compareAll()
|
||||||
|
|
||||||
|
it "before", ->
|
||||||
|
child = new Y.Xml("child")
|
||||||
|
@u1.append child
|
||||||
|
child.before new Y.Xml("left-child")
|
||||||
|
expect(@u1.toString()).to.equal("<root><left-child></left-child><child></child></root>")
|
||||||
|
@yTest.compareAll()
|
||||||
|
|
||||||
|
it "empty", ->
|
||||||
|
child = new Y.Xml("child")
|
||||||
|
@u1.append child
|
||||||
|
child.before new Y.Xml("left-child")
|
||||||
|
expect(@u1.toString()).to.equal("<root><left-child></left-child><child></child></root>")
|
||||||
|
@yTest.compareAll()
|
||||||
|
@u1.empty()
|
||||||
|
expect(@u1.toString()).to.equal("<root></root>")
|
||||||
|
@yTest.compareAll()
|
||||||
|
|
||||||
|
it "remove", ->
|
||||||
|
child = new Y.Xml("child")
|
||||||
|
child2 = new Y.Xml("child2")
|
||||||
|
@u1.prepend child2
|
||||||
|
@u1.prepend child
|
||||||
|
expect(@u1.toString()).to.equal("<root><child></child><child2></child2></root>")
|
||||||
|
@yTest.compareAll()
|
||||||
|
child2.remove()
|
||||||
|
expect(@u1.toString()).to.equal("<root><child></child></root>")
|
||||||
|
|
||||||
|
it "removeAttr", ->
|
||||||
|
@u1.attr("dtrn", "stuff")
|
||||||
|
@u1.attr("dutrianern", "stuff")
|
||||||
|
@yTest.compareAll()
|
||||||
|
@u2.removeAttr("dtrn")
|
||||||
|
@yTest.compareAll()
|
||||||
|
@expect(@u3.attr("dtrn")).to.be.undefined
|
||||||
|
|
||||||
|
it "removeClass", ->
|
||||||
|
@u1.addClass("dtrn")
|
||||||
|
@u1.addClass("iExist")
|
||||||
|
@yTest.compareAll()
|
||||||
|
@u2.removeClass("dtrn")
|
||||||
|
@yTest.compareAll()
|
||||||
|
@expect(@u3.attr("class")).to.equal("iExist")
|
||||||
|
|
||||||
|
it "toggleClass", ->
|
||||||
|
@u1.addClass("dtrn")
|
||||||
|
@u1.addClass("iExist")
|
||||||
|
@yTest.compareAll()
|
||||||
|
@u2.removeClass("dtrn")
|
||||||
|
@yTest.compareAll()
|
||||||
|
@expect(@u3.attr("class")).to.equal("iExist")
|
||||||
|
@u3.toggleClass("iExist")
|
||||||
|
@u3.toggleClass("wraa")
|
||||||
|
@yTest.compareAll()
|
||||||
|
expect(@u1.attr("class")).to.equal("wraa")
|
||||||
|
|
||||||
|
it "getParent", ->
|
||||||
|
child = new Y.Xml("child")
|
||||||
|
@u1.prepend(child)
|
||||||
|
expect(@u1).to.equal(child.getParent())
|
||||||
|
|
||||||
|
it "getChildren", ->
|
||||||
|
child = new Y.Xml("child")
|
||||||
|
@u1.prepend(child)
|
||||||
|
expect(@u1.getChildren()[0]).to.equal(child)
|
||||||
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user