text: /*===
  basic
  object 3 [object Array]
  0 foo
  1 bar
  2 quux
  object 7 [object Array]
  0 0
  1 1
  2 2
  3 3
  4 4
  5 5
  6 length
  ===*/
  
  print('basic');
  
  function basicTest() {
      var proto = { proto: 'prototype' };
      var obj;
  
      function test(o) {
          var t = Object.getOwnPropertyNames(o);
          var i;
  
          print(typeof t, t.length, Object.prototype.toString.call(t));
          for (i = 0; i < t.length; i++) {
              print(i, t[i]);
          }
      }
  
      obj = Object.create(proto);
      obj.foo = 1;
      obj.bar = 2;
      obj.quux = 3;
  
      // return own properties only; order is not mandated but we expect
      // that properties are returned in definition order here too
      test(obj);
  
      // character index properties must be returned (however, Rhino does not)
      test(new String('foobar'));
  }
  
  try {
      basicTest();
  } catch (e) {
      print(e);
  }
  
  /*===
  coercion
  TypeError
  TypeError
  TypeError
  TypeError
  TypeError
  TypeError
  TypeError
  object
  object
  object
  ===*/
  
  print('coercion');
  
  function coercionTest() {
      function test(o, is_noarg) {
          var t;
  
          try {
              if (is_noarg) {
                  t = Object.getOwnPropertyNames(o);
              } else {
                  t = Object.getOwnPropertyNames(o);
              }
              print(typeof t);  // don't print length because function properties are custom
          } catch (e) {
              print(e.name);
          }
      }
  
      test(undefined, true);
      test(undefined);
      test(null);
      test(true);
      test(false);
      test(123);
      test('foo');
      test([1,2]);
      test({ foo: 1, bar: 2 });
      test(function(){});
  }
  
  try {
      coercionTest();
  } catch (e) {
      print(e);
  }
  
  