function topfoo() {}
assert.sameValue(topfoo.name, "topfoo", "declaration");
assert.sameValue((function bar() {}).name, "bar", "named expression");
function outer() { function inner() {} return inner.name; }
assert.sameValue(outer(), "inner", "nested declaration");
var anon = function () {};
assert.sameValue(anon.name, "anon", "var-inferred function");
const arrow = () => {};
assert.sameValue(arrow.name, "arrow", "var-inferred arrow");
let h = function () {};
assert.sameValue(h.name, "h", "let-inferred");
var x = function baz() {};
assert.sameValue(x.name, "baz", "named expression over binding");
var o = { method() {}, fn: () => 1, prop: function () {} };
assert.sameValue(o.method.name, "method", "concise method");
assert.sameValue(o.fn.name, "fn", "arrow property");
assert.sameValue(o.prop.name, "prop", "function property");
class Foo {}
assert.sameValue(Foo.name, "Foo", "class name");
assert.sameValue((function () {}).name, "", "anonymous");
assert.sameValue((function (a, b) {}).length, 2, "length");