var smart_pointer_not = require("smart_pointer_not");

f = new smart_pointer_not.Foo();
b = new smart_pointer_not.Bar(f);
s = new smart_pointer_not.Spam(f);
g = new smart_pointer_not.Grok(f);

// This is the only that should work
f.getx();

// Accessing an inexistent property in JS
// does not throw - it returns undefined
fail = false;
try {
    x = b.getx();
    fail = new Error("Error! b.x");
} catch { }
if (fail) throw fail;

try {
    x = s.getx();
    fail = new Error("Error! b.x");
} catch { }
if (fail) throw fail;

try {
    x = g.getx();
    fail = new Error("Error! b.x");
} catch { }
if (fail) throw fail;