import changeCappuccino, * as namespace from "./namespace/drink.js" import { shouldBe, shouldThrow } from "./resources/assert.js"; shouldBe(typeof namespace, 'object'); shouldBe(typeof changeCappuccino, 'function'); shouldBe(namespace.Cocoa, 'Cocoa'); shouldBe(namespace.Cappuccino, 'Cappuccino'); shouldBe(namespace.Matcha, 'Matcha'); shouldBe(namespace.Mocha, 'Mocha'); shouldBe(namespace.default, changeCappuccino); changeCappuccino('Cocoa'); shouldBe(namespace.Cocoa, 'Cocoa'); shouldBe(namespace.Cappuccino, 'Cocoa'); shouldBe(namespace.Matcha, 'Matcha'); shouldBe(namespace.Mocha, 'Mocha'); shouldBe(namespace.default, changeCappuccino); shouldBe('Cocoa' in namespace, true); shouldBe('Cappuccino' in namespace, true); shouldBe('Matcha' in namespace, true); shouldBe('Mocha' in namespace, true); shouldBe('default' in namespace, true); shouldBe(Symbol.iterator in namespace, false); shouldBe('Tea' in namespace, false); shouldBe(namespace.__proto__, undefined); shouldBe(Reflect.isExtensible(namespace), false); shouldBe(Reflect.set(namespace, 'Extended', 42), false); shouldBe('Extended' in namespace, false); shouldBe(Reflect.set(namespace, 42, 42), false); shouldBe(42 in namespace, false); shouldThrow(() => { namespace.value = 20; }, `TypeError: Attempted to assign to readonly property.`); shouldThrow(() => { namespace[20] = 20; }, `TypeError: Attempted to assign to readonly property.`); shouldThrow(() => { namespace[Symbol.unscopables] = 20; }, `TypeError: Attempted to assign to readonly property.`); shouldThrow(() => { Object.defineProperty(namespace, 'Cookie', { value: 42 }); }, `TypeError: Attempting to define property on object that is not extensible.`); shouldThrow(() => { namespace.__proto__ = Object.prototype; }, `TypeError: Attempted to assign to readonly property.`); shouldBe(Reflect.setPrototypeOf(namespace, Object.prototype), false); shouldBe(namespace.__proto__, undefined); shouldBe(Reflect.getPrototypeOf(namespace), null); // These names should be shown in the code point order. shouldBe(JSON.stringify(Object.getOwnPropertyNames(namespace)), `["Cappuccino","Cocoa","Matcha","Mocha","default"]`); shouldBe(Object.getOwnPropertySymbols(namespace).length, 1); shouldBe(Object.getOwnPropertySymbols(namespace)[0], Symbol.toStringTag); // The imported binding properties of the namespace object seen as writable, but, it does not mean that it is writable by users. shouldBe(JSON.stringify(Reflect.getOwnPropertyDescriptor(namespace, "Cocoa")), `{"value":"Cocoa","writable":true,"enumerable":true,"configurable":false}`); shouldBe(JSON.stringify(Reflect.getOwnPropertyDescriptor(namespace, "Matcha")), `{"value":"Matcha","writable":true,"enumerable":true,"configurable":false}`); shouldBe(JSON.stringify(Reflect.getOwnPropertyDescriptor(namespace, "Mocha")), `{"value":"Mocha","writable":true,"enumerable":true,"configurable":false}`); shouldThrow(() => { // Throw an error even if the same value. namespace.Cocoa = 'Cocoa'; }, `TypeError: Attempted to assign to readonly property.`); shouldBe(JSON.stringify(Reflect.getOwnPropertyDescriptor(namespace, Symbol.toStringTag)), `{"value":"Module","writable":false,"enumerable":false,"configurable":false}`); shouldThrow(() => { namespace[Symbol.toStringTag] = 42; }, `TypeError: Attempted to assign to readonly property.`); shouldBe(Reflect.deleteProperty(namespace, Symbol.toStringTag), false);