// Copyright 2009 The Closure Library Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS-IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. goog.provide('goog.debug.ErrorTest'); goog.setTestOnly('goog.debug.ErrorTest'); goog.require('goog.debug.Error'); goog.require('goog.testing.ExpectedFailures'); goog.require('goog.testing.jsunit'); goog.require('goog.userAgent'); goog.require('goog.userAgent.product'); var expectedFailures; function setUpPage() { expectedFailures = new goog.testing.ExpectedFailures(); } function tearDown() { expectedFailures.handleTearDown(); } function testError() { function xxxxx() { yyyyy(); } function yyyyy() { zzzzz(); } function zzzzz() { throw new goog.debug.Error('testing'); } var stack = null, message = null; try { xxxxx(); } catch (e) { message = e.message; if (e.stack) { stack = e.stack.split('\n'); } } assertEquals('Message property should be set', 'testing', message); expectedFailures.expectFailureFor( (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('10')) || goog.userAgent.product.SAFARI || (goog.userAgent.product.CHROME && !goog.userAgent.isVersionOrHigher(532)), 'error.stack is not widely supported'); try { assertNotNull(stack); if (goog.userAgent.product.FIREFOX && goog.userAgent.isVersionOrHigher('2.0')) { // Firefox 4 and greater does not have the first line that says // 'Error'. So we insert a dummy line to simplify the test. stack.splice(0, 0, 'Error'); } // If the stack trace came from a synthetic Error object created // inside the goog.debug.Error constructor, it will have an extra frame // at stack[1]. If it came from captureStackTrace or was attached // by IE when the error was caught, it will not. if (!Error.captureStackTrace && !goog.userAgent.IE) { stack.splice(1, 1); // Remove stack[1]. } assertContains('1st line of stack should have "Error"', 'Error', stack[0]); assertContains('2nd line of stack should have "zzzzz"', 'zzzzz', stack[1]); assertContains('3rd line of stack should have "yyyyy"', 'yyyyy', stack[2]); assertContains('4th line of stack should have "xxxxx"', 'xxxxx', stack[3]); } catch (e) { expectedFailures.handleException(e); } } function testInheriting() { function MyError() { goog.debug.Error.call(this); } goog.inherits(MyError, goog.debug.Error); MyError.prototype.message = 'My custom error'; var message = null; try { throw new MyError(); } catch (e) { message = e.message; } assertEquals('My custom error', message); }