vsn 0.1.26 → 0.1.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AST.js +2197 -0
- package/dist/AST.js.map +1 -0
- package/dist/Attribute.d.ts +1 -1
- package/dist/Attribute.js +187 -0
- package/dist/Attribute.js.map +1 -0
- package/dist/Bencmark.js +179 -0
- package/dist/Bencmark.js.map +1 -0
- package/dist/Configuration.d.ts +1 -1
- package/dist/Configuration.js +64 -0
- package/dist/Configuration.js.map +1 -0
- package/dist/Controller.d.ts +1 -1
- package/dist/Controller.js +54 -0
- package/dist/Controller.js.map +1 -0
- package/dist/DOM/DOMObject.d.ts +1 -1
- package/dist/DOM/DOMObject.js +47 -0
- package/dist/DOM/DOMObject.js.map +1 -0
- package/dist/DOM/WrappedDocument.js +34 -0
- package/dist/DOM/WrappedDocument.js.map +1 -0
- package/dist/DOM/WrappedWindow.js +45 -0
- package/dist/DOM/WrappedWindow.js.map +1 -0
- package/dist/DOM.d.ts +1 -1
- package/dist/DOM.js +547 -0
- package/dist/DOM.js.map +1 -0
- package/dist/EventDispatcher.d.ts +26 -0
- package/dist/EventDispatcher.js +117 -0
- package/dist/EventDispatcher.js.map +1 -0
- package/dist/Formats.js +44 -0
- package/dist/Formats.js.map +1 -0
- package/dist/MessageList.d.ts +14 -0
- package/dist/MessageList.js +88 -0
- package/dist/MessageList.js.map +1 -0
- package/dist/Model/Collection.d.ts +5 -0
- package/dist/Model/Collection.js +37 -0
- package/dist/Model/Collection.js.map +1 -0
- package/dist/Model/DataModel.d.ts +6 -0
- package/dist/Model/DataModel.js +54 -0
- package/dist/Model/DataModel.js.map +1 -0
- package/dist/Model/ModelAbstract.d.ts +20 -0
- package/dist/Model/ModelAbstract.js +122 -0
- package/dist/Model/ModelAbstract.js.map +1 -0
- package/dist/Model/fields/BooleanField.d.ts +5 -0
- package/dist/Model/fields/BooleanField.js +43 -0
- package/dist/Model/fields/BooleanField.js.map +1 -0
- package/dist/Model/fields/EmailField.d.ts +5 -0
- package/dist/Model/fields/EmailField.js +36 -0
- package/dist/Model/fields/EmailField.js.map +1 -0
- package/dist/Model/fields/Field.d.ts +13 -0
- package/dist/Model/fields/Field.js +79 -0
- package/dist/Model/fields/Field.js.map +1 -0
- package/dist/Model/fields/FloatField.d.ts +5 -0
- package/dist/Model/fields/FloatField.js +47 -0
- package/dist/Model/fields/FloatField.js.map +1 -0
- package/dist/Model/fields/PositiveNumberField.d.ts +5 -0
- package/dist/Model/fields/PositiveNumberField.js +51 -0
- package/dist/Model/fields/PositiveNumberField.js.map +1 -0
- package/dist/Model/fields/StringField.d.ts +5 -0
- package/dist/Model/fields/StringField.js +43 -0
- package/dist/Model/fields/StringField.js.map +1 -0
- package/dist/Model.d.ts +11 -0
- package/dist/Model.js +72 -0
- package/dist/Model.js.map +1 -0
- package/dist/Query.js +66 -0
- package/dist/Query.js.map +1 -0
- package/dist/Registry.d.ts +2 -2
- package/dist/Registry.js +128 -0
- package/dist/Registry.js.map +1 -0
- package/dist/Scope.d.ts +7 -10
- package/dist/Scope.js +462 -0
- package/dist/Scope.js.map +1 -0
- package/dist/SimplePromise.d.ts +42 -0
- package/dist/SimplePromise.js +217 -0
- package/dist/SimplePromise.js.map +1 -0
- package/dist/Tag/List.js +85 -0
- package/dist/Tag/List.js.map +1 -0
- package/dist/Tag.js +770 -0
- package/dist/Tag.js.map +1 -0
- package/dist/Types.js +48 -0
- package/dist/Types.js.map +1 -0
- package/dist/attributes/AddClassIf.js +93 -0
- package/dist/attributes/AddClassIf.js.map +1 -0
- package/dist/attributes/Bind.js +272 -0
- package/dist/attributes/Bind.js.map +1 -0
- package/dist/attributes/ClassConstructor.js +104 -0
- package/dist/attributes/ClassConstructor.js.map +1 -0
- package/dist/attributes/ClickRemoveClass.js +114 -0
- package/dist/attributes/ClickRemoveClass.js.map +1 -0
- package/dist/attributes/ClickToggleClass.js +114 -0
- package/dist/attributes/ClickToggleClass.js.map +1 -0
- package/dist/attributes/ControllerAttribute.js +28 -0
- package/dist/attributes/ControllerAttribute.js.map +1 -0
- package/dist/attributes/DisableIf.js +94 -0
- package/dist/attributes/DisableIf.js.map +1 -0
- package/dist/attributes/Exec.js +108 -0
- package/dist/attributes/Exec.js.map +1 -0
- package/dist/attributes/Format.js +99 -0
- package/dist/attributes/Format.js.map +1 -0
- package/dist/attributes/If.js +159 -0
- package/dist/attributes/If.js.map +1 -0
- package/dist/attributes/JSONAttribute.js +118 -0
- package/dist/attributes/JSONAttribute.js.map +1 -0
- package/dist/attributes/KeyAbstract.js +117 -0
- package/dist/attributes/KeyAbstract.js.map +1 -0
- package/dist/attributes/KeyDown.js +88 -0
- package/dist/attributes/KeyDown.js.map +1 -0
- package/dist/attributes/KeyUp.js +88 -0
- package/dist/attributes/KeyUp.js.map +1 -0
- package/dist/attributes/List.js +282 -0
- package/dist/attributes/List.js.map +1 -0
- package/dist/attributes/ListItem.js +138 -0
- package/dist/attributes/ListItem.js.map +1 -0
- package/dist/attributes/ListItemModel.js +39 -0
- package/dist/attributes/ListItemModel.js.map +1 -0
- package/dist/attributes/ModelAttribute.js +29 -0
- package/dist/attributes/ModelAttribute.js.map +1 -0
- package/dist/attributes/Name.js +88 -0
- package/dist/attributes/Name.js.map +1 -0
- package/dist/attributes/On.js +135 -0
- package/dist/attributes/On.js.map +1 -0
- package/dist/attributes/Radio.js +174 -0
- package/dist/attributes/Radio.js.map +1 -0
- package/dist/attributes/Referenced.js +38 -0
- package/dist/attributes/Referenced.js.map +1 -0
- package/dist/attributes/RootAttribute.js +91 -0
- package/dist/attributes/RootAttribute.js.map +1 -0
- package/dist/attributes/ScopeAttribute.js +40 -0
- package/dist/attributes/ScopeAttribute.js.map +1 -0
- package/dist/attributes/ScopeChange.js +130 -0
- package/dist/attributes/ScopeChange.js.map +1 -0
- package/dist/attributes/SetAttribute.js +133 -0
- package/dist/attributes/SetAttribute.js.map +1 -0
- package/dist/attributes/StandardAttribute.js +186 -0
- package/dist/attributes/StandardAttribute.js.map +1 -0
- package/dist/attributes/StyleAttribute.js +183 -0
- package/dist/attributes/StyleAttribute.js.map +1 -0
- package/dist/attributes/Template.js +39 -0
- package/dist/attributes/Template.js.map +1 -0
- package/dist/attributes/TypeAttribute.js +104 -0
- package/dist/attributes/TypeAttribute.js.map +1 -0
- package/dist/attributes/_imports.js +60 -0
- package/dist/attributes/_imports.js.map +1 -0
- package/dist/helpers/DOMHelper.js +81 -0
- package/dist/helpers/DOMHelper.js.map +1 -0
- package/dist/helpers/ElementHelper.js +25 -0
- package/dist/helpers/ElementHelper.js.map +1 -0
- package/dist/helpers/VisionHelper.js +71 -0
- package/dist/helpers/VisionHelper.js.map +1 -0
- package/dist/helpers/decorators.js +38 -0
- package/dist/helpers/decorators.js.map +1 -0
- package/dist/vsn.d.ts +2 -1
- package/dist/vsn.js +166 -0
- package/dist/vsn.js.map +1 -0
- package/package.json +2 -6
- package/src/AST.ts +2 -2
- package/src/Attribute.ts +2 -2
- package/src/Configuration.ts +3 -3
- package/src/Controller.ts +1 -1
- package/src/DOM/DOMObject.ts +1 -1
- package/src/DOM.ts +3 -3
- package/src/EventDispatcher.ts +117 -0
- package/src/Formats.ts +2 -2
- package/src/MessageList.ts +81 -0
- package/src/Model/Collection.ts +13 -0
- package/src/Model/DataModel.ts +29 -0
- package/src/Model/ModelAbstract.ts +114 -0
- package/src/Model/fields/BooleanField.ts +16 -0
- package/src/Model/fields/EmailField.ts +12 -0
- package/src/Model/fields/Field.ts +65 -0
- package/src/Model/fields/FloatField.ts +22 -0
- package/src/Model/fields/PositiveNumberField.ts +24 -0
- package/src/Model/fields/StringField.ts +16 -0
- package/src/Model.ts +57 -0
- package/src/Registry.ts +3 -3
- package/src/Scope.ts +33 -89
- package/src/SimplePromise.ts +219 -0
- package/src/Tag.ts +2 -2
- package/src/attributes/Bind.ts +1 -1
- package/src/attributes/List.ts +3 -3
- package/src/attributes/Radio.ts +1 -1
- package/src/attributes/ScopeChange.ts +1 -1
- package/src/attributes/StandardAttribute.ts +1 -1
- package/src/attributes/StyleAttribute.ts +1 -1
- package/src/vsn.ts +3 -2
- package/test/AST.spec.ts +2 -1
- package/test/MessageList.spec.ts +101 -0
- package/test/Model/DataModel.spec.ts +141 -0
- package/test/Model.spec.ts +306 -0
- package/test/Scope.spec.ts +2 -2
- package/test/SimplePromise.spec.ts +271 -0
- package/test/attributes/Bind.spec.ts +5 -5
- package/test/attributes/ListItem.spec.ts +1 -1
- package/dist/vsn.min.js +0 -1
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import {DataModel} from "../../src/Model/DataModel";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
describe('Model', () => {
|
|
5
|
+
it("Should trigger a change event when any field is changed", () => {
|
|
6
|
+
const m = new DataModel(['foo']);
|
|
7
|
+
let value = null,
|
|
8
|
+
field = null;
|
|
9
|
+
|
|
10
|
+
m.on('change', (_field, values) => {
|
|
11
|
+
field = _field;
|
|
12
|
+
value = values.value;
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
m.foo = 'testing';
|
|
16
|
+
|
|
17
|
+
expect<string | null>(field).toBe('foo');
|
|
18
|
+
expect(value).toBe(m.foo);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it("Should create the given fields from an object", () => {
|
|
22
|
+
const m = new DataModel({
|
|
23
|
+
field_1: 1,
|
|
24
|
+
field_2: 'yes',
|
|
25
|
+
field_3: true
|
|
26
|
+
});
|
|
27
|
+
expect(m.getFields().length).toBe(3);
|
|
28
|
+
|
|
29
|
+
m.setData({field_4: 4, field_5: 5});
|
|
30
|
+
expect(m.getFields().length).toBe(5);
|
|
31
|
+
const data = m.getData();
|
|
32
|
+
expect(data['field_1']).toBe(1);
|
|
33
|
+
expect(data['field_2']).toBe('yes');
|
|
34
|
+
expect(data['field_3']).toBe(true);
|
|
35
|
+
expect(data['field_4']).toBe(4);
|
|
36
|
+
expect(data['field_5']).toBe(5);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("Should create the given fields from an array", () => {
|
|
40
|
+
const m = new DataModel([
|
|
41
|
+
'field_1',
|
|
42
|
+
'field_2',
|
|
43
|
+
'field_3'
|
|
44
|
+
]);
|
|
45
|
+
expect(m.getFields().length).toBe(3);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("Should trigger a change event when a field is changed", () => {
|
|
49
|
+
const m = new DataModel({
|
|
50
|
+
field_1: 1,
|
|
51
|
+
field_2: 'yes',
|
|
52
|
+
field_3: true
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
let oldValue = null,
|
|
56
|
+
oldValueCheck = null,
|
|
57
|
+
value = null;
|
|
58
|
+
|
|
59
|
+
m.bindToFields('change', [
|
|
60
|
+
'field_2',
|
|
61
|
+
'field_1'
|
|
62
|
+
], (values) => {
|
|
63
|
+
oldValue = values.oldValue;
|
|
64
|
+
value = values.value;
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Test to make sure field_1 change event is being called
|
|
68
|
+
oldValueCheck = m.field_1;
|
|
69
|
+
m.field_1 = 2;
|
|
70
|
+
expect(value).toBe(m.field_1);
|
|
71
|
+
expect(oldValue).toBe(oldValueCheck);
|
|
72
|
+
|
|
73
|
+
// Test to make sure field_2 change event is being called
|
|
74
|
+
oldValueCheck = m.field_2;
|
|
75
|
+
m.field_2 = 'no';
|
|
76
|
+
expect(value).toBe(m.field_2);
|
|
77
|
+
expect(oldValue).toBe(oldValueCheck);
|
|
78
|
+
|
|
79
|
+
// Test to make sure fields that aren't being listened to aren't
|
|
80
|
+
// triggering the event
|
|
81
|
+
oldValueCheck = m.foo;
|
|
82
|
+
m.foo = false;
|
|
83
|
+
expect(value).not.toBe(m.foo);
|
|
84
|
+
expect(oldValue).not.toBe(oldValueCheck);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it("Should trigger a change:field event when any field is changed", () => {
|
|
88
|
+
const m = new DataModel(['field_1']);
|
|
89
|
+
let value = null;
|
|
90
|
+
|
|
91
|
+
m.on('change:field_1', (values) => {
|
|
92
|
+
value = values.value;
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
m.field_1 = 'testing';
|
|
96
|
+
|
|
97
|
+
expect(value).toBe(m.field_1);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("should save last data and return true with is modfied if something is modified", () => {
|
|
101
|
+
const m = new DataModel({
|
|
102
|
+
field_1: 1,
|
|
103
|
+
field_2: 'foo'
|
|
104
|
+
});
|
|
105
|
+
m.setLastData();
|
|
106
|
+
expect(m.isModified()).toBe(false);
|
|
107
|
+
m.field_1 = 2;
|
|
108
|
+
m.field_2 = null;
|
|
109
|
+
expect(m.isModified()).toBe(true);
|
|
110
|
+
m.setLastData();
|
|
111
|
+
expect(m.isModified()).toBe(false);
|
|
112
|
+
m.field_2 = 'bar';
|
|
113
|
+
expect(m.isModified()).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("should revert to last data correctly", () => {
|
|
117
|
+
const m = new DataModel({
|
|
118
|
+
field_1: 1,
|
|
119
|
+
field_2: 'bar'
|
|
120
|
+
});
|
|
121
|
+
m.setLastData();
|
|
122
|
+
expect(m.isModified()).toBe(false);
|
|
123
|
+
m.field_1 = 2;
|
|
124
|
+
m.field_2 = null;
|
|
125
|
+
expect(m.isModified()).toBe(true);
|
|
126
|
+
m.revert();
|
|
127
|
+
expect(m.isModified()).toBe(false);
|
|
128
|
+
expect(m.field_1).toBe(1);
|
|
129
|
+
expect(m.field_2).toBe('bar');
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it("should return the field object", () => {
|
|
133
|
+
const m = new DataModel({
|
|
134
|
+
field_1: 1,
|
|
135
|
+
field_2: 'string field!'
|
|
136
|
+
}),
|
|
137
|
+
field = m.getField('field_2');
|
|
138
|
+
expect(field.value).toBe('string field!');
|
|
139
|
+
|
|
140
|
+
});
|
|
141
|
+
});
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import {field, Field} from "../src/Model/fields/Field";
|
|
2
|
+
import {Model} from "../src/Model";
|
|
3
|
+
import {Collection} from "../src/Model/Collection";
|
|
4
|
+
import {EmailField} from "../src/Model/fields/EmailField";
|
|
5
|
+
import {FloatField} from "../src/Model/fields/FloatField";
|
|
6
|
+
import {PositiveIntegerField} from "../src/Model/fields/PositiveNumberField";
|
|
7
|
+
import {StringField} from "../src/Model/fields/StringField";
|
|
8
|
+
import {BooleanField} from "../src/Model/fields/BooleanField";
|
|
9
|
+
|
|
10
|
+
class TestCollection extends Collection<TestModel> {
|
|
11
|
+
getDefault: () => any = (): any => {
|
|
12
|
+
for(const i of this) {
|
|
13
|
+
if(i.is_default)
|
|
14
|
+
return i;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
class AbstractTestModel extends Model {
|
|
20
|
+
@field()
|
|
21
|
+
id!: number;
|
|
22
|
+
|
|
23
|
+
@field(Field, {
|
|
24
|
+
required:true
|
|
25
|
+
})
|
|
26
|
+
required_field!: string | null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
class TestModel extends AbstractTestModel {
|
|
30
|
+
static collectionClass = TestCollection;
|
|
31
|
+
|
|
32
|
+
@field()
|
|
33
|
+
foo!: boolean;
|
|
34
|
+
|
|
35
|
+
@field()
|
|
36
|
+
name!: string;
|
|
37
|
+
|
|
38
|
+
@field()
|
|
39
|
+
is_default!: boolean;
|
|
40
|
+
|
|
41
|
+
@field(Field, null)
|
|
42
|
+
invalid_field!: string;
|
|
43
|
+
|
|
44
|
+
@field(EmailField)
|
|
45
|
+
email!: string;
|
|
46
|
+
|
|
47
|
+
@field(FloatField, {
|
|
48
|
+
toFixed: 3
|
|
49
|
+
})
|
|
50
|
+
float_field!: number;
|
|
51
|
+
|
|
52
|
+
@field(PositiveIntegerField)
|
|
53
|
+
positive_integer_field!: number;
|
|
54
|
+
|
|
55
|
+
@field(StringField)
|
|
56
|
+
string_field!: string;
|
|
57
|
+
|
|
58
|
+
@field(BooleanField)
|
|
59
|
+
boolean_field!: boolean;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
class TestModel2 extends AbstractTestModel {
|
|
63
|
+
@field()
|
|
64
|
+
shouldnt_exist!: boolean;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
describe('Model', () => {
|
|
69
|
+
it("should throw an error when a field is required and the value is null", function() {
|
|
70
|
+
const m = new TestModel();
|
|
71
|
+
expect(m.validate()['required_field'].length).toBe(1);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("should be invalid when a field validation fails", function() {
|
|
75
|
+
const m = new TestModel({
|
|
76
|
+
required_field: true,
|
|
77
|
+
email: 'testing'
|
|
78
|
+
});
|
|
79
|
+
expect(m.validate()['email'].length).toBe(1);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("should not throw an error when a field that is required value is not null", function() {
|
|
83
|
+
const m = new TestModel();
|
|
84
|
+
m.required_field = 'yes';
|
|
85
|
+
expect(m.validate()['required_field']).toBe(undefined);
|
|
86
|
+
expect(m.hasErrors()).toBe(false);
|
|
87
|
+
expect(m.errors.length).toBe(0);
|
|
88
|
+
m.required_field = null;
|
|
89
|
+
m.validate();
|
|
90
|
+
expect(m.hasErrors()).toBe(true);
|
|
91
|
+
expect(m.errors.length).toBe(1);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it("Should trigger a change event when any field is changed", () => {
|
|
95
|
+
const m = new TestModel();
|
|
96
|
+
let value: string | null = null,
|
|
97
|
+
field: string | null = null;
|
|
98
|
+
|
|
99
|
+
m.on('change', (_field, values) => {
|
|
100
|
+
field = _field;
|
|
101
|
+
value = values.value;
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
m.required_field = 'testing';
|
|
105
|
+
|
|
106
|
+
expect<string | null>(field).toBe('required_field');
|
|
107
|
+
expect<string | null>(value).toBe(m.required_field);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("Should trigger a change event when a field is changed", () => {
|
|
111
|
+
const m = new TestModel({
|
|
112
|
+
id: 1,
|
|
113
|
+
required_field: 'yes',
|
|
114
|
+
foo: true,
|
|
115
|
+
positive_integer_field: 1
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
let oldValue = null,
|
|
119
|
+
oldValueCheck: number | null = null,
|
|
120
|
+
value: number | null = null;
|
|
121
|
+
|
|
122
|
+
m.bindToFields('change', [
|
|
123
|
+
'required_field',
|
|
124
|
+
'id',
|
|
125
|
+
'shouldnt_exist',
|
|
126
|
+
'positive_integer_field'
|
|
127
|
+
], (values) => {
|
|
128
|
+
oldValue = values.oldValue;
|
|
129
|
+
value = values.value;
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// Test to make sure id change event is being called
|
|
133
|
+
oldValueCheck = m.id;
|
|
134
|
+
m.id = 2;
|
|
135
|
+
expect(value).toBe(m.id);
|
|
136
|
+
expect(oldValue).toBe(oldValueCheck);
|
|
137
|
+
|
|
138
|
+
// Test to make sure required_field change event is being called
|
|
139
|
+
const stringValueCheck: string | null = m.required_field;
|
|
140
|
+
m.required_field = 'no';
|
|
141
|
+
expect(value).toBe(m.required_field as any);
|
|
142
|
+
expect(oldValue).toBe(stringValueCheck);
|
|
143
|
+
|
|
144
|
+
// Test to make sure positive_integer_field change event is being called
|
|
145
|
+
oldValueCheck = m.positive_integer_field;
|
|
146
|
+
m.positive_integer_field = 15;
|
|
147
|
+
expect(value).toBe(m.positive_integer_field);
|
|
148
|
+
expect(oldValue).toBe(oldValueCheck);
|
|
149
|
+
|
|
150
|
+
// Test to make sure fields that aren't being listened to aren't
|
|
151
|
+
// triggering the event
|
|
152
|
+
const boolValueCheck: boolean = m.foo;
|
|
153
|
+
m.foo = false;
|
|
154
|
+
expect(value).not.toBe(m.foo as any);
|
|
155
|
+
expect(oldValue).not.toBe(boolValueCheck);
|
|
156
|
+
|
|
157
|
+
// Test to make sure fields that aren't being listened to aren't
|
|
158
|
+
// triggering the event
|
|
159
|
+
oldValueCheck = m.shouldnt_exist;
|
|
160
|
+
m.foo = true;
|
|
161
|
+
expect(value).not.toBe(m.foo as any);
|
|
162
|
+
expect(oldValue).not.toBe(oldValueCheck);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it("Should trigger a change:field event when any field is changed", () => {
|
|
166
|
+
const m = new TestModel();
|
|
167
|
+
let value: string | null = null;
|
|
168
|
+
|
|
169
|
+
m.on('change:required_field', (values) => {
|
|
170
|
+
value = values.value;
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
m.required_field = 'testing';
|
|
174
|
+
|
|
175
|
+
expect<string | null>(value).toBe(m.required_field);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it("should save last data and return true with is modfied if something is modified", () => {
|
|
179
|
+
const m = new TestModel({
|
|
180
|
+
id: 1,
|
|
181
|
+
required_field: 'required!'
|
|
182
|
+
});
|
|
183
|
+
m.setLastData();
|
|
184
|
+
expect(m.isModified()).toBe(false);
|
|
185
|
+
m.id = 2;
|
|
186
|
+
expect(m.isModified()).toBe(true);
|
|
187
|
+
m.setLastData();
|
|
188
|
+
expect(m.isModified()).toBe(false);
|
|
189
|
+
m.required_field = 'still required';
|
|
190
|
+
expect(m.isModified()).toBe(true);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it("should revert to last data correctly", () => {
|
|
194
|
+
const m = new TestModel({
|
|
195
|
+
id: 1,
|
|
196
|
+
required_field: 'required!'
|
|
197
|
+
});
|
|
198
|
+
m.setLastData();
|
|
199
|
+
expect(m.isModified()).toBe(false);
|
|
200
|
+
m.id = 2;
|
|
201
|
+
m.required_field = null;
|
|
202
|
+
expect(m.isModified()).toBe(true);
|
|
203
|
+
m.revert();
|
|
204
|
+
expect(m.isModified()).toBe(false);
|
|
205
|
+
expect(m.id).toBe(1);
|
|
206
|
+
expect<string | null>(m.required_field).toBe('required!');
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
it("should return the field object", () => {
|
|
210
|
+
const m = new TestModel({
|
|
211
|
+
id: 1,
|
|
212
|
+
required_field: 'required!'
|
|
213
|
+
}),
|
|
214
|
+
field = m.getField('required_field');
|
|
215
|
+
expect(field.value).toBe('required!');
|
|
216
|
+
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
it("should ignore data that does not match a field", () => {
|
|
220
|
+
const m = new TestModel({
|
|
221
|
+
id: 1,
|
|
222
|
+
required_field: 'required!'
|
|
223
|
+
});
|
|
224
|
+
m.setLastData();
|
|
225
|
+
m.setData({
|
|
226
|
+
spam: 1,
|
|
227
|
+
bar: 'Baz!'
|
|
228
|
+
});
|
|
229
|
+
expect(m.isModified()).toBe(false);
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it("should cast values to field types", () => {
|
|
233
|
+
const m = new TestModel({
|
|
234
|
+
float_field: '1.5111',
|
|
235
|
+
positive_integer_field: '-1',
|
|
236
|
+
string_field: 1,
|
|
237
|
+
boolean_field: 'true'
|
|
238
|
+
});
|
|
239
|
+
expect(m.float_field).toBe(1.511);
|
|
240
|
+
expect(m.positive_integer_field).toBe(0);
|
|
241
|
+
expect(m.string_field).toBe('1');
|
|
242
|
+
expect(m.boolean_field).toBe(true);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
describe('Collection', () => {
|
|
247
|
+
it("should be able to use methods defined in TestCollection", function() {
|
|
248
|
+
const collection = new TestCollection();
|
|
249
|
+
|
|
250
|
+
collection.push(new TestModel({
|
|
251
|
+
name: 'Model 1',
|
|
252
|
+
is_default: false
|
|
253
|
+
}));
|
|
254
|
+
|
|
255
|
+
collection.push(new TestModel({
|
|
256
|
+
name: 'Model 2',
|
|
257
|
+
is_default: true
|
|
258
|
+
}));
|
|
259
|
+
|
|
260
|
+
collection.push(new TestModel({
|
|
261
|
+
name: 'Model 3',
|
|
262
|
+
is_default: false
|
|
263
|
+
}));
|
|
264
|
+
|
|
265
|
+
collection.push(new TestModel({
|
|
266
|
+
name: 'Model 4',
|
|
267
|
+
is_default: false
|
|
268
|
+
}));
|
|
269
|
+
|
|
270
|
+
expect(collection.getDefault().name).toBe('Model 2');
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
it("should return data from all models in the collection", function() {
|
|
274
|
+
const collection = new TestCollection();
|
|
275
|
+
|
|
276
|
+
collection.push(new TestModel({
|
|
277
|
+
name: 'Model 1',
|
|
278
|
+
is_default: false
|
|
279
|
+
}));
|
|
280
|
+
|
|
281
|
+
collection.push(new TestModel({
|
|
282
|
+
name: 'Model 2',
|
|
283
|
+
is_default: true
|
|
284
|
+
}));
|
|
285
|
+
|
|
286
|
+
collection.push(new TestModel({
|
|
287
|
+
name: 'Model 3',
|
|
288
|
+
is_default: false
|
|
289
|
+
}));
|
|
290
|
+
|
|
291
|
+
collection.push(new TestModel({
|
|
292
|
+
name: 'Model 4',
|
|
293
|
+
is_default: false
|
|
294
|
+
}));
|
|
295
|
+
const collectionData = collection.getData();
|
|
296
|
+
|
|
297
|
+
expect(collectionData[0].name).toBe('Model 1');
|
|
298
|
+
expect(collectionData[0].is_default).toBe(false);
|
|
299
|
+
expect(collectionData[1].name).toBe('Model 2');
|
|
300
|
+
expect(collectionData[1].is_default).toBe(true);
|
|
301
|
+
expect(collectionData[2].name).toBe('Model 3');
|
|
302
|
+
expect(collectionData[2].is_default).toBe(false);
|
|
303
|
+
expect(collectionData[3].name).toBe('Model 4');
|
|
304
|
+
expect(collectionData[3].is_default).toBe(false);
|
|
305
|
+
});
|
|
306
|
+
});
|
package/test/Scope.spec.ts
CHANGED
|
@@ -30,7 +30,7 @@ describe('WrappedArray', () => {
|
|
|
30
30
|
it("should behave like an array", async () => {
|
|
31
31
|
const a = new WrappedArray();
|
|
32
32
|
let removes: number = 0;
|
|
33
|
-
a.
|
|
33
|
+
a.on('remove', (e) => {
|
|
34
34
|
removes += 1;
|
|
35
35
|
});
|
|
36
36
|
a.push(1);
|
|
@@ -44,7 +44,7 @@ describe('WrappedArray', () => {
|
|
|
44
44
|
it("should trigger change events", async () => {
|
|
45
45
|
const a = new WrappedArray();
|
|
46
46
|
let changes: number = 0;
|
|
47
|
-
a.
|
|
47
|
+
a.on('change', (e) => {
|
|
48
48
|
changes += 1;
|
|
49
49
|
});
|
|
50
50
|
a.push(1);
|