Test case details

Preparation Code

<script src="http://ringjs.neoname.eu/static/js/underscore.js" type="text/javascript"></script> <script src="http://ringjs.neoname.eu/static/js/ring.js" type="text/javascript"></script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/jsface.js"> </script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/my.class.js"> </script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/jrclass.js"> </script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/klass.js"> </script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/classy.js"> </script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/ptclass.js"> </script> <script src="https://raw.github.com/javascript/augment/master/lib/augment.js"> </script> <script src="http://cdn.sencha.com/ext-4.1.1a-gpl/builds/ext-foundation.js"> </script> <script src="https://raw.github.com/torworx/ovy/master/ovy.js"> </script> <script src="http://indigounited.com/dejavu/dejavu.js"> </script> <script src="https://raw.github.com/jayferd/pjs/master/src/p.js"></script> <script src="https://gist.github.com/yckart/5267295/raw/Class.js"></script> <script src="http://symtales.net/alch/src/A.min.js"></script> <script src="https://raw.github.com/weikinhuang/Classify/master/dist/classify.js"></script> <script src="https://raw.github.com/google/traceur-compiler/master/bin/traceur.js"></script> <script>   var RingPerson = ring.create({     $init: function(name) {       this.name = name;     },     setAddress: function(country, city, street) {       this.country = country;       this.city = city;       this.street = street;     }   });   var RingFrenchGuy = ring.create([RingPerson], {     $init: function(name) {       RingFrenchGuy.__super__.$init.call(this, name);     },     setAddress: function(city, street) {       RingFrenchGuy.__super__.setAddress.call(this, 'France', city, street);     }   });   var RingParisLover = ring.create([RingFrenchGuy], {     $init: function(name) {       RingParisLover.__super__.$init.call(this, name);     },     setAddress: function(street) {       RingParisLover.__super__.setAddress.call(this, 'Paris', street);     }   });   var __hasProp = {}.hasOwnProperty,       __extends = function(child, parent) {       for (var key in parent) {         if (__hasProp.call(parent, key)) child[key] = parent[key];       }       function ctor() {         this.constructor = child;       }       ctor.prototype = parent.prototype;       child.prototype = new ctor();       child.__super__ = parent.prototype;       return child;       };   var JSFacePerson = jsface.Class({     constructor: function(name) {       this.name = name;     },     setAddress: function(country, city, street) {       this.country = country;       this.city = city;       this.street = street;     }   });   var JSFaceFrenchGuy = jsface.Class(JSFacePerson, {     constructor: function(name) {       JSFaceFrenchGuy.$super.call(this, name);     },     setAddress: function(city, street) {       JSFaceFrenchGuy.$superp.setAddress.call(this, 'France', city, street);     }   });   var JSFaceParisLover = jsface.Class(JSFaceFrenchGuy, {     constructor: function(name) {       JSFaceParisLover.$super.call(this, name);     },     setAddress: function(street) {       JSFaceParisLover.$superp.setAddress.call(this, 'Paris', street);     }   });   var MyPerson = my.Class({     constructor: function(name) {       this.name = name;     },     setAddress: function(country, city, street) {       this.country = country;       this.city = city;       this.street = street;     }   });   var MyFrenchGuy = my.Class(MyPerson, {     constructor: function(name) {       MyFrenchGuy.Super.call(this, name);     },     setAddress: function(city, street) {       MyFrenchGuy.Super.prototype.setAddress.call(this, 'France', city, street);     }   });   var MyParisLover = my.Class(MyFrenchGuy, {     constructor: function(name) {       MyParisLover.Super.call(this, name);     },     setAddress: function(street) {       MyParisLover.Super.prototype.setAddress.call(this, 'Paris', street);     }   });   var JRPerson = JRClass.extend({     init: function(name) {       this.name = name;     },     setAddress: function(country, city, street) {       this.country = country;       this.city = city;       this.street = street;     },     sayHello: function() {       console.log('I am ' + this.name + '. My address is ' + this.country + ', ' + this.city + ', ' + this.street + '.');     }   });   var JRFrenchGuy = JRPerson.extend({     init: function(name) {       this._super(name);     },     setAddress: function(city, street) {       this._super('France', city, street);     }   });   var JRParisLover = JRFrenchGuy.extend({     init: function(name) {       this._super(name);     },     setAddress: function(street) {       this._super('Paris', street);     }   });   var EnderPerson = klass(function(name) {     this.name = name;   }).methods({     setAddress: function(country, city, street) {       this.country = country;       this.city = city;       this.street = street;     }   });   var EnderFrenchGuy = EnderPerson.extend(function(name) {}).methods({     setAddress: function(city, street) {       this.supr('France', city, street);     }   });   var EnderParisLover = EnderFrenchGuy.extend(function(name) {}).methods({     setAddress: function(street) {       this.supr('Paris', street);     }   });   var ClassyPerson = Classy.$extend({     __init__: function(name) {       this.name = name;     },     setAddress: function(country, city, street) {       this.country = country;       this.city = city;       this.street = street;     }   });   var ClassyFrenchGuy = ClassyPerson.$extend({     __init__: function(name) {       this.$super(name);     },     setAddress: function(city, street) {       this.$super('France', city, street);     }   });   var ClassyParisLover = ClassyFrenchGuy.$extend({     __init__: function(name) {       this.$super(name);     },     setAddress: function(street) {       this.$super('Paris', street);     }   });   var PTClassPerson = PTClass.create({     initialize: function(name) {       this.name = name;     },     setAddress: function(country, city, street) {       this.country = country;       this.city = city;       this.street = street;     }   });   var PTClassFrenchGuy = PTClass.create(PTClassPerson, {     initialize: function($super, name) {       $super(name);     },     setAddress: function($super, city, street) {       $super('France', city, street);     }   });   var PTClassParisLover = PTClass.create(PTClassFrenchGuy, {     initialize: function($super, name) {       $super(name);     },     setAddress: function($super, street) {       $super('Paris', street);     }   });   var CoffeePerson = (function() {     function CoffeePerson(name) {       this.name = name;     }     CoffeePerson.prototype.setAddress = function(country, city, street) {       this.country = country;       this.city = city;       this.street = street;     };     return CoffeePerson;   })();   var CoffeeFrenchGuy = (function(_super) {     __extends(CoffeeFrenchGuy, _super);     function CoffeeFrenchGuy(name) {       CoffeeFrenchGuy.__super__.constructor.call(this, name);     }     CoffeeFrenchGuy.prototype.setAddress = function(city, street) {       return CoffeeFrenchGuy.__super__.setAddress.call(this, "France", city, street);     };     return CoffeeFrenchGuy;   })(CoffeePerson);   var CoffeeParisLover = (function(_super) {     __extends(CoffeeParisLover, _super);     function CoffeeParisLover(name) {       CoffeeParisLover.__super__.constructor.call(this, name);     }     CoffeeParisLover.prototype.setAddress = function(street) {       return CoffeeParisLover.__super__.setAddress.call(this, "Paris", street);     };     return CoffeeParisLover;   })(CoffeeFrenchGuy);   Ext.define('ExtPerson', {     constructor: function(name) {       this.name = name;     },     setAddress: function(country, city, street) {       this.country = country;       this.city = city;       this.street = street;     }   });   Ext.define('ExtChinaGuy', {     extend: 'ExtPerson',     constructor: function() {       this.callParent(arguments);     },     setAddress: function(city, street) {       this.callParent(['China', city, street]);     }   });   Ext.define('ExtBeiJingLover', {     extend: 'ExtChinaGuy',     constructor: function(name) {       this.callParent(arguments);     },     setAddress: function(street) {       this.callParent(['BeiJing', street]);     }   });   var dejavuClassPerson = dejavu.Class.declare({     initialize: function(name) {       this.name = name;     },     setAddress: function(country, city, street) {       this.country = country;       this.city = city;       this.street = street;     }   });   var dejavuClassFrenchGuy = dejavu.Class.declare({     $extends: dejavuClassPerson,     setAddress: function(city, street) {       this.$super('France', city, street);     }   });   var dejavuClassParisLover = dejavu.Class.declare({     $extends: dejavuClassFrenchGuy,     setAddress: function(street) {       this.$super('Paris', street);     }   });   var dejavuClassPerson2 = dejavu.Class.declare({     initialize: function(name){       this.name = name;     },     setAddress: function(country, city, street) {       this.country = country;       this.city = city;       this.street = street;     }   }, true);   var dejavuClassFrenchGuy2 = dejavu.Class.declare({     $extends: dejavuClassPerson2,     initialize: function (name) {       dejavuClassPerson2.call(this, name);     },     setAddress: function(city, street) {       dejavuClassPerson2.prototype.setAddress.call(this, 'France', city, street);     }   }, true);   var dejavuClassParisLover2 = dejavu.Class.declare({     $extends: dejavuClassFrenchGuy2,     initialize: function (name) {       dejavuClassFrenchGuy2.call(this, name);     },     setAddress: function(street) {       dejavuClassFrenchGuy2.prototype.setAddress.call(this, 'Paris', street);     }   }, true);   var dejavuClassPerson3 = dejavu.Class.declare(function () {     return {           initialize: function(name){               this.name = name;           },           setAddress: function(country, city, street) {               this.country = country;               this.city = city;               this.street = street;           }       };   }, true);   var dejavuClassFrenchGuy3 = dejavuClassPerson3.extend(function ($super) {      return {          setAddress: function(city, street) {              $super.setAddress.call(this, 'France', city, street);          }      };   }, true);   var dejavuClassParisLover3 = dejavuClassFrenchGuy3.extend(function ($super) {       return {           setAddress: function(street) {               $super.setAddress.call(this, 'Paris', street);           }       };   }, true);   var OvyPerson = Ovy.define({     constructor: function(name) {       this.name = name;     },     setAddress: function(country, city, street) {       this.country = country;       this.city = city;       this.street = street;     }   });   var OvyChinaGuy = Ovy.define({     extend: OvyPerson,     constructor: function(name) {       OvyChinaGuy.$superclass.call(this, name)     },     setAddress: function(city, street) {       OvyChinaGuy.$super.setAddress.call(this, 'China', city, street);     }   });   var OvyBeijingLover = Ovy.define({     extend: OvyChinaGuy,     constructor: function(name) {       OvyBeijingLover.$superclass.call(this, name);     },     setAddress: function(street) {       OvyBeijingLover.$super.setAddress.call(this, 'Beijing', street);     }   });   var AugmentPerson = Object.augment(function() {     this.constructor = function (name) {       this.name = name;     };     this.setAddress = function(country, city, street) {       this.country = country;       this.city = city;       this.street = street;     };   });   var AugmentFrenchGuy = AugmentPerson.augment(function(base) {     var setAddress = base.setAddress;     this.constructor = function (name) {       AugmentPerson.call(this, name);     };     this.setAddress = function(city, street) {       setAddress.call(this, "France", city, street);     };   });   var AugmentParisLover = AugmentFrenchGuy.augment(function(base) {     var setAddress = base.setAddress;     this.constructor = function (name) {       AugmentFrenchGuy.call(this, name);     };     this.setAddress = function(street) {       setAddress.call(this, "Paris", street);     };   });   var PPerson = P(function(proto) {     proto.init = function (name) {       this.name = name;     };     proto.setAddress = function(country, city, street) {       this.country = country;       this.city = city;       this.street = street;     };   });   var PFrenchGuy = P(PPerson, function(proto, person) {     var setAddress = person.setAddress;     proto.init = function (name) {       PPerson.call(this, name);     };     proto.setAddress = function(city, street) {       setAddress.call(this, "France", city, street);     };   });   var PParisLover = P(PFrenchGuy, function(proto, frenchGuy) {     var setAddress = frenchGuy.setAddress;     proto.init = function (name) {       PFrenchGuy.call(this, name);     };     proto.setAddress = function(street) {       setAddress.call(this, "Paris", street);     };   });   var ClassifyPerson = Classify({     init: function (name) {       this.name = name;     },     setAddress: function(country, city, street) {       this.country = country;       this.city = city;       this.street = street;     }   });     var ClassifyFrenchGuy = Classify(ClassifyPerson, {     init: function (name) {       this.parent(name);     },     setAddress: function(city, street) {       this.parent("France", city, street);     }   });   var ClassifyParisLover = Classify(ClassifyFrenchGuy, {     init: function (name) {       this.parent(name);     },     setAddress: function(street) {       this.parent("Paris", street);     }   });         A.define("AlchemyPerson",                  {                      constructor : function (name) {                          this.name = name;                      },                      setAddress       : function (country, city, street) {                          this.country = country;                          this.city = city;                          this.street = street;                      }                  });         A.define("AlchemyFrenchGuy",                  {                      use         : ["AlchemyPerson"],                      setAddress  : function (city, street) {                          this._parent("France", city, street);                      }                  });         A.define("AlchemyParisLover",                  {                      use         : ["AlchemyFrenchGuy"],                      constructor : function (name) {                          this.callParent(arguments);                      },                      setAddress       : function (street) {                          this._parent("Paris", street);                      }                  }); var $__getDescriptors = function(object) {   var descriptors = {}, name, names = Object.getOwnPropertyNames(object);   for (var i = 0; i < names.length; i++) {     var name = names[i];     descriptors[name] = Object.getOwnPropertyDescriptor(object, name);   }   return descriptors; }, $__createClassNoExtends = function(object, staticObject) {   var ctor = object.constructor;   Object.defineProperty(object, 'constructor', {enumerable: false});   ctor.prototype = object;   Object.defineProperties(ctor, $__getDescriptors(staticObject));   return ctor; }, $__superDescriptor = function(proto, name) {   if (!proto) throw new TypeError('super is null');   return Object.getPropertyDescriptor(proto, name); }, $__superCall = function(self, proto, name, args) {   var descriptor = $__superDescriptor(proto, name);   if (descriptor) {     if ('value'in descriptor) return descriptor.value.apply(self, args);     if (descriptor.get) return descriptor.get.call(self).apply(self, args);   }   throw new TypeError("Object has no method '" + name + "'."); }, $__getProtoParent = function(superClass) {   if (typeof superClass === 'function') {     var prototype = superClass.prototype;     if (Object(prototype) === prototype || prototype === null) return superClass.prototype;   }   if (superClass === null) return null;   throw new TypeError(); }, $__createClass = function(object, staticObject, protoParent, superClass, hasConstructor) {   var ctor = object.constructor;   if (typeof superClass === 'function') ctor.__proto__ = superClass;   if (!hasConstructor && protoParent === null) ctor = object.constructor = function() {};   var descriptors = $__getDescriptors(object);   descriptors.constructor.enumerable = false;   ctor.prototype = Object.create(protoParent, descriptors);   Object.defineProperties(ctor, $__getDescriptors(staticObject));   return ctor; }; </script>

Test cases

Test #1

var p3 = new JSFaceParisLover("Mary"); p3.setAddress("CH");

Test #2

var p6 = new MyParisLover("Mary"); p6.setAddress("CH");

Test #3

var p9 = new JRParisLover("Mary"); p9.setAddress("CH");

Test #4

var p12 = new EnderParisLover("Mary"); p12.setAddress("CH");

Test #5

var p15 = new ClassyParisLover("Mary"); p15.setAddress("CH");

Test #6

var p18 = new PTClassParisLover("Mary"); p18.setAddress("CH");

Test #7

var p21 = new CoffeeParisLover("Mary"); p21.setAddress("CH");

Test #8

var p24 = new AugmentParisLover("Mary"); p24.setAddress("CH");

Test #9

var p27 = new ExtBeiJingLover("Mary"); p27.setAddress("CH");

Test #10

var p30 = new OvyBeijingLover("Mary"); p30.setAddress("CH");

Test #11

var p33 = new dejavuClassParisLover("Mary"); p33.setAddress("CH");

Test #12

var p36 = new dejavuClassParisLover2("Mary"); p36.setAddress("CH");

Test #13

var p39 = new dejavuClassParisLover3("Mary"); p39.setAddress("CH");

Test #14

var p42 = new PParisLover("Mary"); p42.setAddress("CH");

Test #15

var p45 = new ClassParisLover("Mary"); p45.setAddress("CH");

Test #16

var p48 = new NativeParisLover("Mary"); p48.setAddress("CH");

Test #17

var p52 = new ClassifyParisLover("Mary"); p52.setAddress("CH");

Test #18

var p99 = new nextParisLover("Mary"); p99.setAdress("CH");

Test #19

var p1000 = {}; p1000.name = "Mary"; p1000.city = "Paris"; p1000.address = "CH"; p1000.country = "France";

Test #20

var p69 = new RingParisLover("Mary"); p69.setAddress("CH");