// Copyright 2009 the Sputnik authors.  All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
info: Operator x >> y returns ToNumber(x) >> ToNumber(y)
es5id: 11.7.2_A3_T2.2
description: >
    Type(x) is different from Type(y) and both types vary between
    Number (primitive or object) and String (primitive and object)
---*/

//CHECK#1
if ("1" >> 1 !== 0) {
  throw new Test262Error('#1: "1" >> 1 === 0. Actual: ' + ("1" >> 1));
}

//CHECK#2
if (1 >> "1" !== 0) {
  throw new Test262Error('#2: 1 >> "1" === 0. Actual: ' + (1 >> "1"));
}

//CHECK#3
if (new String("1") >> 1 !== 0) {
  throw new Test262Error('#3: new String("1") >> 1 === 0. Actual: ' + (new String("1") >> 1));
}

//CHECK#4
if (1 >> new String("1") !== 0) {
  throw new Test262Error('#4: 1 >> new String("1") === 0. Actual: ' + (1 >> new String("1")));
}

//CHECK#5
if ("1" >> new Number(1) !== 0) {
  throw new Test262Error('#5: "1" >> new Number(1) === 0. Actual: ' + ("1" >> new Number(1)));
}

//CHECK#6
if (new Number(1) >> "1" !== 0) {
  throw new Test262Error('#6: new Number(1) >> "1" === 0. Actual: ' + (new Number(1) >> "1"));
}

//CHECK#7
if (new String("1") >> new Number(1) !== 0) {
  throw new Test262Error('#7: new String("1") >> new Number(1) === 0. Actual: ' + (new String("1") >> new Number(1)));
}

//CHECK#8
if (new Number(1) >> new String("1") !== 0) {
  throw new Test262Error('#8: new Number(1) >> new String("1") === 0. Actual: ' + (new Number(1) >> new String("1")));
}

//CHECK#9
if ("x" >> 1 !== 0) {
  throw new Test262Error('#9: "x" >> 1 === 0. Actual: ' + ("x" >> 1));
}

//CHECK#10
if (1 >> "x" !== 1) {
  throw new Test262Error('#10: 1 >> "x" === 1. Actual: ' + (1 >> "x"));
}
