chai = require('chai') expect = chai.expect should = chai.should() sinon = require('sinon') sinonChai = require('sinon-chai') _ = require("underscore") $ = require('jquery') 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" Y.Text = require "../lib/Types/Text" Test = require "./TestSuite" class XmlTest extends Test constructor: (suffix)-> super suffix, Y @doSomething_amount *= 20 makeNewUser: (userId)-> conn = new Y.Test userId super new Y conn initUsers: (u)-> u.val("xml",new Y.Xml("div")) type: "XmlTest" compare: (o1, o2, depth)-> if o1.constructor is Y.Xml super o1._model, o2._model, depth else super getRandomRoot: (user_num, root, depth = @max_depth)-> root ?= @users[user_num].val("xml") if depth is 0 or _.random(0,1) is 1 # take root root else # take child 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-- getRandomXmlElement: ()-> if _.random(0,1) is 0 new Y.Xml(@getRandomKey()) else @getRandomText() getGeneratingFunctions: (user_num)-> that = @ super(user_num).concat [ f : (y)=> # set Attribute y.attr(that.getRandomKey(), that.getRandomText()) types: [Y.Xml] , f : (y)-> # DELETE Attribute keys = Object.keys(y.attr()) y.removeAttr(keys[_.random(0,keys.length-1)]) types : [Y.Xml] , f : (y)-> # Add Class y.addClass(that.getRandomKey()) types : [Y.Xml] , f : (y)-> # toggleClass y.toggleClass(that.getRandomKey()) types : [Y.Xml] , f : (y)-> # Remove Class keys = y.attr("class").split(" ") y.removeClass(keys[_.random(0,keys.length-1)]) types : [Y.Xml] , f : (y)-> # append XML child = that.getRandomXmlElement() y.append(child) types : [Y.Xml] , f : (y)-> # pepend XML child = that.getRandomXmlElement() y.prepend child types : [Y.Xml] , f : (y)-> # after XML if y.getParent()? child = that.getRandomXmlElement() y.after child types : [Y.Xml] , f : (y)-> # before XML if y.getParent()? child = that.getRandomXmlElement() y.before child types : [Y.Xml] , f : (y)-> # empty y.empty() types : [Y.Xml] , f : (y)-> # remove if y.getParent()? y.remove() types : [Y.Xml] ] 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() console.log(@yTest.users[0].val("xml")+"") it "has a working test suite", -> @yTest.compareAll() it "handles double-late-join", -> test = new XmlTest("double") test.run() @yTest.run() u1 = test.users[0] u2 = @yTest.users[1] ops1 = u1._model.HB._encode() ops2 = u2._model.HB._encode() u1._model.engine.applyOp ops2, true u2._model.engine.applyOp ops1, true 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("
") @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("
") @yTest.compareAll() it "after", -> child = new Y.Xml("child") @u1.append child child.after new Y.Xml("right-child") expect(@u1.toString()).to.equal("
") @yTest.compareAll() it "before", -> child = new Y.Xml("child") @u1.append child child.before new Y.Xml("left-child") expect(@u1.toString()).to.equal("
") @yTest.compareAll() it "empty", -> child = new Y.Xml("child") @u1.append child child.before new Y.Xml("left-child") expect(@u1.toString()).to.equal("
") @yTest.compareAll() @u1.empty() expect(@u1.toString()).to.equal("
") @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("
") @yTest.compareAll() child2.remove() expect(@u1.toString()).to.equal("
") 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) if not window? describe "skip DOM tests (only in browser environment)", -> it "", -> else describe "DOM binding ", -> beforeEach (done)-> @dom = @u1.getDom() @j = $(@dom) done() it "can transform to a new real Dom element", -> expect(@dom).to.not.be.undefined it "supports dom.insertBefore", -> newdom = $("

dtrn

")[0] newdom2 = $("

dtrn2

")[0] @dom.insertBefore(newdom2, null) @dom.insertBefore(newdom, newdom2) expect(@u1+"").to.equal("

dtrn

dtrn2

") expect(@dom.outerHTML).to.equal("

dtrn

dtrn2

") it "supports dom.appendChild", -> newdom = $("

dtrn

")[0] @dom.appendChild(newdom) expect(@u1+"").to.equal("

dtrn

") it "supports dom.setAttribute", -> @dom.setAttribute("test_attribute", "newVal") expect(@u1.attr("test_attribute")).to.equal("newVal") expect(@dom.getAttribute("test_attribute")).to.equal("newVal") it "supports dom.removeAttribute", -> @dom.setAttribute("test_attribute", "newVal") expect(@u1.attr("test_attribute")).to.equal("newVal") expect(@dom.getAttribute("test_attribute")).to.equal("newVal") @dom.removeAttribute("test_attribute") expect(@u1.attr("test_attribute")).to.be.undefined expect(@dom.getAttribute("test_attribute")).to.be.undefined it "supports dom.removeChild", -> newdom = $("

dtrn

")[0] @dom.appendChild(newdom) expect(@u1+"").to.equal("

dtrn

") expect(@dom.outerHTML).to.equal("

dtrn

") @dom.removeChild(newdom) expect(@dom.childNodes.length).to.equal(0) expect(@u1.getChildren().length).to.equal(0) it "supports dom.replaceChild", -> dom = $("

dtrn

")[0] @dom.appendChild(newdom) expect(@u1+"").to.equal("

dtrn

") expect(@dom.outerHTML).to.equal("

dtrn

") newdom = $("

replaced

")[0] @dom.replaceChild(dom,newdom) expect(@dom.outerHTML).to.equal("

replaced

") expect(@u1+"").to.equal("

replaced

") it "supports dom.classList.add", -> @dom.classList.add "classy" @dom.classList.add "moreclassy" expect(@u1.attr("class")).to.equal("classy moreclassy") expect(@dom.getAttribute("class")).to.equal("classy moreclassy") it "supports dom.textContent", -> dom = $("

dtrn

")[0] @dom.appendChild(newdom) expect(@u1+"").to.equal("

dtrn

") expect(@dom.outerHTML).to.equal("

dtrn

") @dom.textContent = "" expect(@u1+"").to.equal("
") expect(@dom.outerHTML).to.equal("
") it "suppports dom.textContent (non empty string)", -> dom = $("

dtrn

")[0] @dom.appendChild(newdom) expect(@u1+"").to.equal("

dtrn

") expect(@dom.outerHTML).to.equal("

dtrn

") @dom.textContent = "stuff" expect(@u1+"").to.equal("
stuff
") expect(@dom.outerHTML).to.equal("
stuff
") it "supports jquery.addClass", -> @j.addClass("testy") @j.addClass("testedy tested") expect(@dom.getAttribute("class")).to.equal("testy testedy tested") it "supports jquery.after", -> d = $("") @dom.appendChild(d[0], null) d.after("
after
") expect(@dom.outerHTML).to.equal("
after
") expect(@u1+"").to.equal("
after
") it "supports jquery.append", -> d = $("")[0] @j.append(d) d = $("
")[0] @dom.append(d) expect(@dom.outerHTML).to.equal("
") expect(@u1+"").to.equal("
") it "supports jquery.appendTo", -> $("appendedTo").appendTo(@dom) $("p").appendTo(@dom) expect(@dom.outerHTML).to.equal("
appendedTo

") expect(@u1+"").to.equal("
appendedTo

") it "supports jquery.before", -> newdom = $("p") $(@dom).append(newdom) newdom.before("
before
") expect(@dom.outerHTML).to.equal("
before

") expect(@u1+"").to.equal("
before

") it "supports jquery.detach", -> d = $("p") $j.append(d) $j.detach("p") expect(@dom.outerHTML).to.equal("
") expect(@u1+"").to.equal("
") it "supports jquery.empty", -> d = $("

") d.appendTo(@dom) d = $("

") d.appendTo(@dom) @j.empty() expect(@dom.outerHTML).to.equal("
") expect(@u1+"").to.equal("
") it "supports jquery.insertAfter", -> d = $("span") d.appendTo(@dom) $("

after

").insertAfter(d) expect(@dom.outerHTML).to.equal("

after

") expect(@u1+"").to.equal("

after

") it "supports jquery.insertBefore", -> d = $("span") d.appendTo(@j) $("

after

").insertAfter(d) expect(@dom.outerHTML).to.equal("

before

") expect(@u1+"").to.equal("

before

") it "supports jquery.prepend", -> @j.prepend("

prepended2

") @j.prepend("

prepended1

") expect(@dom.outerHTML).to.equal("

prepended1

prepended2

") expect(@u1+"").to.equal("

prepended1

prepended2

") it "supports jquery.prependTo", -> $("

prepended2

").prependTo(@j) $("

prepended1

").prependTo(@j) expect(@dom.outerHTML).to.equal("

prepended1

prepended2

") expect(@u1+"").to.equal("

prepended1

prepended2

") it "supports jquery.remove", -> d = $("
") d.prependTo(@j) d.remove() expect(@dom.outerHTML).to.equal("
") expect(@u1+"").to.equal("
") it "supports jquery.removeAttr", -> @dom.setAttribute("test_attribute", "newVal") expect(@u1.attr("test_attribute")).to.equal("newVal") expect(@dom.getAttribute("test_attribute")).to.equal("newVal") @j.removeAttr("test_attribute") expect(@u1.attr("test_attribute")).to.be.undefined expect(@j.attr("test_attribute")).to.be.undefined it "supports jquery.removeClass", -> @j.addClass("testy") @j.addClass("testedy tested") expect(@dom.getAttribute("class")).to.equal("testy testedy tested") @j.removeClass("testedy") expect(@dom.getAttribute("class")).to.equal("testy tested") expect(@u1.hasClass("testedy")).to.be.false it "supports jquery.attr", -> @j.attr("atone", "yeah") expect(@u1.attr("atone")).to.equal("yeah") it "supports jquery.replaceAll", -> $("New span content ").replaceAll("#test_dom div") @check() it "supports jquery.replaceWith", -> d = $("span") @j.prepend(d) d = $("span") @j.prepend(d) d = $("span") @j.prepend(d) d = @j.getElementsByTagName("span") d.replaceWith("
") expect(@dom.outerHTML).to.equal("
") expect(@u1+"").to.equal("
")