98 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| var d                        = require("../")
 | |
|   , getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
 | |
| 
 | |
| module.exports = function (t, a) {
 | |
| 	var Foo = function () {}, i = 1, o, o2, desc;
 | |
| 	Object.defineProperties(
 | |
| 		Foo.prototype,
 | |
| 		t({
 | |
| 			bar: d(function () { return ++i; }),
 | |
| 			bar2: d(function () { return this.bar + 23; }),
 | |
| 			bar3: d(function () { return this.bar2 + 34; }, { desc: "ew" }),
 | |
| 			bar4: d(function () { return this.bar3 + 12; }, { cacheName: "_bar4_" }),
 | |
| 			bar5: d(function () { return this.bar4 + 3; }, { cacheName: "_bar5_", desc: "e" })
 | |
| 		})
 | |
| 	);
 | |
| 
 | |
| 	desc = getOwnPropertyDescriptor(Foo.prototype, "bar");
 | |
| 	a(desc.configurable, true, "Configurable: default");
 | |
| 	a(desc.enumerable, false, "Enumerable: default");
 | |
| 
 | |
| 	o = new Foo();
 | |
| 	a.deep([o.bar, o.bar2, o.bar3, o.bar4, o.bar5], [2, 25, 59, 71, 74], "Values");
 | |
| 
 | |
| 	a.deep(
 | |
| 		getOwnPropertyDescriptor(o, "bar3"),
 | |
| 		{ configurable: false, enumerable: true, writable: true, value: 59 }, "Desc"
 | |
| 	);
 | |
| 	a(o.hasOwnProperty("bar4"), false, "Cache not exposed");
 | |
| 	desc = getOwnPropertyDescriptor(o, "bar5");
 | |
| 	a.deep(
 | |
| 		desc, { configurable: false, enumerable: true, get: desc.get, set: desc.set },
 | |
| 		"Cache & Desc: desc"
 | |
| 	);
 | |
| 
 | |
| 	o2 = Object.create(o);
 | |
| 	o2.bar = 30;
 | |
| 	o2.bar3 = 100;
 | |
| 
 | |
| 	a.deep(
 | |
| 		[o2.bar, o2.bar2, o2.bar3, o2.bar4, o2.bar5], [30, 25, 100, 112, 115], "Extension Values"
 | |
| 	);
 | |
| 
 | |
| 	Foo = function () {};
 | |
| 	Object.defineProperties(
 | |
| 		Foo.prototype,
 | |
| 		t({
 | |
| 			test: d("w", function () { return "raz"; }),
 | |
| 			test2: d("", function () { return "raz"; }, { desc: "w" }),
 | |
| 			test3: d("", function () { return "raz"; }, { cacheName: "__test3__", desc: "w" }),
 | |
| 			test4: d("w", "bar")
 | |
| 		})
 | |
| 	);
 | |
| 
 | |
| 	o = new Foo();
 | |
| 	o.test = "marko";
 | |
| 	a.deep(
 | |
| 		getOwnPropertyDescriptor(o, "test"),
 | |
| 		{ configurable: false, enumerable: false, writable: true, value: "marko" }, "Set before get"
 | |
| 	);
 | |
| 	o.test2 = "marko2";
 | |
| 	a.deep(
 | |
| 		getOwnPropertyDescriptor(o, "test2"),
 | |
| 		{ configurable: false, enumerable: false, writable: true, value: "marko2" },
 | |
| 		"Set before get: Custom desc"
 | |
| 	);
 | |
| 	o.test3 = "marko3";
 | |
| 	a.deep(
 | |
| 		getOwnPropertyDescriptor(o, "__test3__"),
 | |
| 		{ configurable: false, enumerable: false, writable: true, value: "marko3" },
 | |
| 		"Set before get: Custom cache name"
 | |
| 	);
 | |
| 	a(o.test4, "bar", "Resolve by value");
 | |
| 
 | |
| 	a.h1("Flat");
 | |
| 	Object.defineProperties(
 | |
| 		Foo.prototype,
 | |
| 		t({
 | |
| 			flat: d(function () { return "foo"; }, { flat: true }),
 | |
| 			flat2: d(function () { return "bar"; }, { flat: true })
 | |
| 		})
 | |
| 	);
 | |
| 
 | |
| 	a.h2("Instance");
 | |
| 	a(o.flat, "foo", "Value");
 | |
| 	a(o.hasOwnProperty("flat"), false, "Instance");
 | |
| 	a(Foo.prototype.flat, "foo", "Prototype");
 | |
| 
 | |
| 	a.h2("Direct");
 | |
| 	a(Foo.prototype.flat2, "bar");
 | |
| 
 | |
| 	a.h2("Reset direct");
 | |
| 	Object.defineProperties(Foo.prototype, t({ testResetDirect: d(false) }));
 | |
| 
 | |
| 	a.throws(function () { Foo.prototype.testResetDirect = false; }, TypeError);
 | |
| };
 |