refactor: simplify and make tests work in JS and Dart

* remove `wraps` syntax enhancements for imports
  and support new `import * as module from ...` syntax

  - default imports are the wrong construct for importing
    everything from a module

* moved tests from transpiler to jasmine and karma

  - transpiler tests are included when running karma in main project folder
  - transpiler is reloaded after every test run in karma,
    so no need to restart karma when the transpiler has been changed.
  - removed own gulp build for transpiler and `postinstall.sh`
    as they are no more needed.
  - transpiler tests are now executed in Dart AND JavaScript (used to be executed
    only in Dart), which allowed to catch some bugs (see the bug with the
    import specification above).

* made tests work in dart as well by using the following hack:

  - dependencies are loaded from the `build` folder, which makes
    running `gulp build` necessary before running karma for dart
  - for this to work,
    the dependencies are included in main `pubspec.yaml` of project
  - reason for the hack: `karma-dart` loads all `packages` urls
    directly from disc (should rather use the karma file list)

* added explicit annotations `FIELD`, `ABSTRACT`, ... to `facade/lang.*`

  - needed for now that we can run tests and don't get errors for undefined
    annotations.

* added `README.md` with details about the build and tests
This commit is contained in:
Tobias Bosch
2014-09-28 13:55:01 -07:00
parent 817c005845
commit c79f0c3472
47 changed files with 338 additions and 508 deletions

View File

@ -5,3 +5,5 @@ dependencies:
dev_dependencies:
test_lib:
path: ../test_lib
facade:
path: ../facade

View File

@ -1,5 +1,6 @@
import {WatchGroup} from './watch_group';
import {Record} from './record';
import {FIELD} from 'facade/lang';
export class ChangeDetection {

View File

@ -1,4 +1,5 @@
//import {ProtoWatchGroup, WatchGroup} from './watch_group';
import {FIELD} from 'facade/lang';
export class ProtoRecord {
@ -53,28 +54,28 @@ export class ProtoRecord {
/**
* Represents a Record for keeping track of changes. A change is a difference between previous
* and current value.
*
* and current value.
*
* By default changes are detected using dirty checking, but a notifier can be present which can
* notify the records of changes by means other than dirty checking. For example Object.observe
* or events on DOM elements.
*
* DESIGN NOTES:
* - No inheritance allowed so that code is monomorphic for performance.
*
* DESIGN NOTES:
* - No inheritance allowed so that code is monomorphic for performance.
* - Atomic watch operations
* - Defaults to dirty checking
* - Keep this object as lean as possible. (Lean in number of fields)
*
*
* MEMORY COST: 13 Words;
*/
export class Record {
@FIELD('final watchGroup:WatchGroup')
@FIELD('final protoRecord:ProtoRecord')
/// order list of all records. Including head/tail markers
@FIELD('_next:Record')
@FIELD('_prev:Record')
/// next record to dirty check
/// next record to dirty check
@FIELD('_checkNext:Record')
@FIELD('_checkPrev:Record')
// next notifier
@ -120,7 +121,7 @@ export class Record {
var notify = mode & MODE_MASK_NOTIFY;
var currentValue;
switch (state) {
case MODE_STATE_MARKER:
case MODE_STATE_MARKER:
return false;
case MODE_STATE_PROPERTY:
currentValue = this._getter(this._context);
@ -136,7 +137,7 @@ export class Record {
}
var previousValue = this.previousValue;
if (isSame(previousValue, currentValue)) return false;
if (previousValue instanceof String && currentValue instanceof String
if (previousValue instanceof String && currentValue instanceof String
&& previousValue == currentValue) {
this.previousValue = currentValue;
return false
@ -178,4 +179,4 @@ function isSame(a, b) {
} else {
return false;
}
}
}

View File

@ -1,4 +1,5 @@
import {ProtoRecord, Record} from './record';
import {FIELD} from 'facade/lang';
export class ProtoWatchGroup {
@FIELD('final _headRecord:ProtoRecord')