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');
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.
});
gulp.task('build', ['sorcery']);
-
+gulp.task('test', ['test-mocha', 'test-mocha-phantomjs']);
gulp.task('default', ['build']);
"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",
"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"
emit(event: string, data: any);
}
+export interface ICharMeasure {
+ width: number;
+ height: number;
+ measure(): void;
+}
+
interface ICircularList<T> {
length: number;
maxLength: number;
--- /dev/null
+/**
+ * @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 = (<any>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);
+ });
+ });
+ });
+
+}
Terminal.EventEmitter = EventEmitter;
Terminal.inherits = inherits;
+// Expose for Phantom.JS tests
+Terminal.CharMeasure = CharMeasure;
+
/**
* Adds an event listener to the terminal.
*
--- /dev/null
+<html>
+ <head>
+ <meta charset="utf-8">
+ <!-- encoding must be set for mocha's special characters to render properly -->
+ <link rel="stylesheet" href="node_modules/mocha/mocha.css" />
+ </head>
+ <body>
+ <div id="mocha"></div>
+ <div id="xterm"></div>
+ <script src="node_modules/mocha/mocha.js"></script>
+ <script src="node_modules/chai/chai.js"></script>
+ <script>
+ mocha.ui('bdd')
+ assert = chai.assert
+ </script>
+ <script src="build/xterm.js"></script>
+ <script src="lib/utils/CharMeasure.phantom.js"></script>
+ <script>
+ mocha.run()
+ </script>
+ </body>
+</html>