+
+ var sampleMethod = function(val) {
+ this._$.attr('x', val);
+ };
+
+ var transformations = {
+ 'unaware': sampleMethod,
+ 'returning change root': {
+ impl: sampleMethod,
+ getChangeRoot: function() {
+ return this.context;
+ }
+ },
+ 'implementing undo operation': {
+ impl: function(t, val) {
+ t.oldVal = this.getAttr('x');
+ sampleMethod.call(this, val);
+ },
+ undo: function(t) {
+ this.setAttr('x', t.oldVal);
+ }
+ }
+ };
+
+ _.pairs(transformations).forEach(function(pair) {
+ var name = pair[0],
+ transformaton = pair[1];
+
+ describe(name + ' transformation: ', function() {
+ var doc, node, nodePath;
+
+ beforeEach(function() {
+ doc = getDocumentFromXML('<div><test x="old"></test></div>');
+
+ doc.registerExtension({elementNode: {transformations: {
+ test: transformaton
+ }}});
+
+ node = doc.root.contents()[0];
+ nodePath = node.getPath();
+ });
+
+ it('transforms as expected', function() {
+ node.test('new');
+ expect(node.getAttr('x')).to.equal('new');
+ });
+
+ it('can be undone', function() {
+ node.test('new');
+ doc.undo();
+ node = doc.getNodeByPath(nodePath);
+ expect(node.getAttr('x')).to.equal('old');
+ });