diff --git a/gulpfile.js b/gulpfile.js index ff4a7438..8aa86b11 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -3,6 +3,8 @@ const buffer = require('vinyl-buffer'); const fs = require('fs-extra'); const gulp = require('gulp'); const merge = require('merge-stream'); +const mocha = require('gulp-mocha'); +const mochaPhantomJs = require('gulp-mocha-phantomjs'); const sorcery = require('sorcery'); const source = require('vinyl-source-stream'); const sourcemaps = require('gulp-sourcemaps'); @@ -68,6 +70,15 @@ gulp.task('browserify', ['tsc'], function() { return merge(bundleStream, copyAddons, copyStylesheets); }); +gulp.task('test-mocha', function () { + return gulp.src(['lib/*test.js', 'lib/**/*test.js'], {read: false}) + .pipe(mocha()) +}); + +gulp.task('test-mocha-phantomjs', function () { + return gulp.src('test-harness.html') + .pipe(mochaPhantomJs()); +}); /** * Use `sorcery` to resolve the source map chain and point back to the TypeScript files. @@ -81,5 +92,5 @@ gulp.task('sorcery', ['browserify'], function () { }); gulp.task('build', ['sorcery']); - +gulp.task('test', ['test-mocha', 'test-mocha-phantomjs']); gulp.task('default', ['build']); diff --git a/package.json b/package.json index c6e6f429..06a7492b 100644 --- a/package.json +++ b/package.json @@ -47,11 +47,12 @@ "glob": "^7.0.5", "gulp": "^3.9.1", "gulp-cli": "^1.2.2", + "gulp-mocha": "^3.0.1", + "gulp-mocha-phantomjs": "^0.12.0", "gulp-sourcemaps": "1.9.1", "gulp-typescript": "^3.1.3", "jsdoc": "3.4.3", "merge-stream": "^1.0.1", - "mocha": "2.5.3", "node-pty": "^0.4.1", "nodemon": "1.10.2", "sleep": "^3.0.1", @@ -66,7 +67,7 @@ "start": "node demo/app", "dev": "nodemon -e js,ts --watch src --watch demo --exec npm start", "lint": "tslint src/*.ts src/**/*.ts", - "test": "mocha --recursive ./lib", + "test": "gulp test", "build:docs": "jsdoc -c jsdoc.json", "build": "gulp build", "prepublish": "npm run build" diff --git a/src/Interfaces.ts b/src/Interfaces.ts index c876d256..92094c95 100644 --- a/src/Interfaces.ts +++ b/src/Interfaces.ts @@ -44,6 +44,12 @@ export interface ITerminal { emit(event: string, data: any); } +export interface ICharMeasure { + width: number; + height: number; + measure(): void; +} + interface ICircularList { length: number; maxLength: number; diff --git a/src/utils/CharMeasure.phantom.ts b/src/utils/CharMeasure.phantom.ts new file mode 100644 index 00000000..f8173dc6 --- /dev/null +++ b/src/utils/CharMeasure.phantom.ts @@ -0,0 +1,65 @@ +/** + * @license MIT + */ +import { ICharMeasure, ITerminal } from '../Interfaces'; + +declare var assert: Chai.Assert; +declare var Terminal: ITerminal; + +// Do not describe tests unless in PhantomJS environment +if (typeof Terminal !== 'undefined') { + + const CharMeasure = (Terminal).CharMeasure; + + describe('CharMeasure', () => { + const parentElement = document.createElement('div'); + let charMeasure: ICharMeasure; + + beforeEach(() => { + charMeasure = new CharMeasure(parentElement); + document.querySelector('#xterm').appendChild(parentElement); + }); + + afterEach(() => { + if (parentElement && parentElement.parentElement) { + parentElement.parentElement.removeChild(parentElement); + } + }); + + describe('measure', () => { + it('should be performed async on first call', done => { + assert.equal(charMeasure.width, null); + charMeasure.measure(); + assert.equal(charMeasure.width, null); + setTimeout(() => { + assert.isTrue(charMeasure.width > 0); + done(); + }, 0); + }); + + it('should be performed sync on successive calls', done => { + charMeasure.measure(); + setTimeout(() => { + const firstWidth = charMeasure.width; + parentElement.style.fontSize = '2em'; + charMeasure.measure(); + assert.equal(charMeasure.width, firstWidth * 2); + done(); + }, 0); + }); + + it('should NOT do a measure when the parent is hidden', done => { + charMeasure.measure(); + setTimeout(() => { + const firstWidth = charMeasure.width; + parentElement.style.display = 'none'; + parentElement.style.fontSize = '2em'; + charMeasure.measure(); + assert.equal(charMeasure.width, firstWidth); + done(); + }, 0); + }); + }); + }); + +} diff --git a/src/xterm.js b/src/xterm.js index 314a76d0..f76c01b5 100644 --- a/src/xterm.js +++ b/src/xterm.js @@ -2237,6 +2237,9 @@ function keys(obj) { Terminal.EventEmitter = EventEmitter; Terminal.inherits = inherits; +// Expose for Phantom.JS tests +Terminal.CharMeasure = CharMeasure; + /** * Adds an event listener to the terminal. * diff --git a/test-harness.html b/test-harness.html new file mode 100644 index 00000000..8c5f0b30 --- /dev/null +++ b/test-harness.html @@ -0,0 +1,22 @@ + + + + + + + +
+
+ + + + + + + +