X Tutup
Skip to content

Commit fad3549

Browse files
committed
test(matchers): add support for toHaveCssStyle matcher
1 parent e1d7bdc commit fad3549

File tree

10 files changed

+94
-2
lines changed

10 files changed

+94
-2
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
@Deprecated('import this library from "package:angular2/platform/browser_static.dart"')
22
library angular2.browser_adapter_reexport;
33

4-
export 'package:angular2/src/platform/browser/browser_adapter.dart';
4+
export 'package:angular2/src/platform/browser/browser_adapter.dart';

modules/angular2/src/platform/browser/browser_adapter.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'dart:html';
44
import 'package:angular2/platform/common_dom.dart' show setRootDomAdapter;
55
import 'generic_browser_adapter.dart' show GenericBrowserDomAdapter;
66
import 'package:angular2/src/facade/browser.dart';
7+
import 'package:angular2/src/facade/lang.dart' show isBlank, isPresent;
78
import 'dart:js' as js;
89

910
// WARNING: Do not expose outside this class. Parsing HTML using this
@@ -335,6 +336,11 @@ class BrowserDomAdapter extends GenericBrowserDomAdapter {
335336
element.style.setProperty(stylename, stylevalue);
336337
}
337338

339+
bool hasStyle(Element element, String stylename, [String stylevalue]) {
340+
var value = this.getStyle(element, stylename);
341+
return isPresent(stylevalue) ? value == stylevalue : value.length > 0;
342+
}
343+
338344
void removeStyle(Element element, String stylename) {
339345
element.style.removeProperty(stylename);
340346
}

modules/angular2/src/platform/browser/browser_adapter.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,10 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter {
207207
}
208208
removeStyle(element, stylename: string) { element.style[stylename] = null; }
209209
getStyle(element, stylename: string): string { return element.style[stylename]; }
210+
hasStyle(element, stylename: string, stylevalue: string = null): boolean {
211+
var value = this.getStyle(element, stylename) || '';
212+
return stylevalue ? value == stylevalue : value.length > 0;
213+
}
210214
tagName(element): string { return element.tagName; }
211215
attributeMap(element): Map<string, string> {
212216
var res = new Map<string, string>();

modules/angular2/src/platform/dom/dom_adapter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ export abstract class DomAdapter {
8989
abstract setStyle(element, stylename: string, stylevalue: string);
9090
abstract removeStyle(element, stylename: string);
9191
abstract getStyle(element, stylename: string): string;
92+
abstract hasStyle(element, stylename: string, stylevalue?: string): boolean;
9293
abstract tagName(element): string;
9394
abstract attributeMap(element): Map<string, string>;
9495
abstract hasAttribute(element, attribute: string): boolean;

modules/angular2/src/platform/server/abstract_html_adapter.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import 'package:html/dom.dart';
66
import 'package:angular2/platform/common_dom.dart';
77
import 'package:angular2/src/compiler/xhr.dart';
88

9+
import 'package:angular2/src/facade/lang.dart' show isBlank, isPresent;
10+
911
const _attrToPropMap = const {
1012
'innerHtml': 'innerHTML',
1113
'readonly': 'readOnly',
@@ -265,6 +267,10 @@ abstract class AbstractHtml5LibAdapter implements DomAdapter {
265267
throw 'not implemented';
266268
}
267269

270+
bool hasStyle(Element element, String styleName, [String styleValue]) {
271+
throw 'not implemented';
272+
}
273+
268274
removeStyle(element, String stylename) {
269275
throw 'not implemented';
270276
}

modules/angular2/src/platform/server/parse5_adapter.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,10 @@ export class Parse5DomAdapter extends DomAdapter {
371371
hasClass(element, classname: string): boolean {
372372
return ListWrapper.contains(this.classList(element), classname);
373373
}
374+
hasStyle(element, stylename: string, stylevalue: string = null): boolean {
375+
var value = this.getStyle(element, stylename) || '';
376+
return stylevalue ? value == stylevalue : value.length > 0;
377+
}
374378
/** @internal */
375379
_readStyleAttribute(element) {
376380
var styleMap = {};

modules/angular2/src/testing/matchers.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import 'package:guinness/guinness.dart' as gns;
66

77
import 'package:angular2/src/platform/dom/dom_adapter.dart' show DOM;
88

9+
import 'package:angular2/src/facade/lang.dart' show isString;
10+
911
Expect expect(actual, [matcher]) {
1012
final expect = new Expect(actual);
1113
if (matcher != null) expect.to(matcher);
@@ -14,6 +16,18 @@ Expect expect(actual, [matcher]) {
1416

1517
const _u = const Object();
1618

19+
bool elementContainsStyle(element, styles) {
20+
var allPassed = true;
21+
if (isString(styles)) {
22+
allPassed = DOM.hasStyle(element, styles);
23+
} else {
24+
styles.forEach((prop, style) {
25+
allPassed = allPassed && DOM.hasStyle(element, prop, style);
26+
});
27+
}
28+
return allPassed;
29+
}
30+
1731
expectErrorMessage(actual, expectedMessage) {
1832
expect(actual.toString()).toContain(expectedMessage);
1933
}
@@ -38,6 +52,9 @@ class Expect extends gns.Expect {
3852
void toBePromise() => gns.guinness.matchers.toBeTrue(actual is Future);
3953
void toHaveCssClass(className) =>
4054
gns.guinness.matchers.toBeTrue(DOM.hasClass(actual, className));
55+
void toHaveCssStyle(styles) {
56+
gns.guinness.matchers.toBeTrue(elementContainsStyle(actual, styles));
57+
}
4158
void toImplement(expected) => toBeA(expected);
4259
void toBeNaN() =>
4360
gns.guinness.matchers.toBeTrue(double.NAN.compareTo(actual) == 0);
@@ -78,6 +95,9 @@ class NotExpect extends gns.NotExpect {
7895
void toBePromise() => gns.guinness.matchers.toBeFalse(actual is Future);
7996
void toHaveCssClass(className) =>
8097
gns.guinness.matchers.toBeFalse(DOM.hasClass(actual, className));
98+
void toHaveCssStyle(styles) {
99+
gns.guinness.matchers.toBeFalse(elementContainsStyle(actual, styles));
100+
}
81101
void toBeNull() => gns.guinness.matchers.toBeFalse(actual == null);
82102
Function get _expect => gns.guinness.matchers.expect;
83103
}

modules/angular2/src/testing/matchers.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import {DOM} from 'angular2/src/platform/dom/dom_adapter';
2-
import {global} from 'angular2/src/facade/lang';
2+
import {global, isString} from 'angular2/src/facade/lang';
3+
import {StringMapWrapper} from 'angular2/src/facade/collection';
34

45

56
export interface NgMatchers extends jasmine.Matchers {
67
toBePromise(): boolean;
78
toBeAnInstanceOf(expected: any): boolean;
89
toHaveText(expected: any): boolean;
910
toHaveCssClass(expected: any): boolean;
11+
toHaveCssStyle(expected: any): boolean;
1012
toImplement(expected: any): boolean;
1113
toContainError(expected: any): boolean;
1214
toThrowErrorWith(expectedMessage: any): boolean;
@@ -105,6 +107,31 @@ _global.beforeEach(function() {
105107
}
106108
},
107109

110+
toHaveCssStyle: function() {
111+
return {
112+
compare: function(actual, styles) {
113+
var allPassed;
114+
if (isString(styles)) {
115+
allPassed = DOM.hasStyle(actual, styles);
116+
} else {
117+
allPassed = !StringMapWrapper.isEmpty(styles);
118+
StringMapWrapper.forEach(styles, (style, prop) => {
119+
allPassed = allPassed && DOM.hasStyle(actual, prop, style);
120+
});
121+
}
122+
123+
return {
124+
pass: allPassed,
125+
get message() {
126+
var expectedValueStr = isString(styles) ? styles : JSON.stringify(styles);
127+
return `Expected ${actual.outerHTML} ${!allPassed ? ' ' : 'not '}to contain the
128+
CSS ${isString(styles) ? 'property' : 'styles'} "${expectedValueStr}"`;
129+
}
130+
};
131+
}
132+
};
133+
},
134+
108135
toContainError: function() {
109136
return {
110137
compare: function(actual, expectedText) {

modules/angular2/test/public_api_spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ var NG_ALL = [
234234
'BrowserDomAdapter.setGlobalVar():js',
235235
'BrowserDomAdapter.setInnerHTML():js',
236236
'BrowserDomAdapter.setProperty():js',
237+
'BrowserDomAdapter.hasStyle():js',
237238
'BrowserDomAdapter.setStyle():js',
238239
'BrowserDomAdapter.setText():js',
239240
'BrowserDomAdapter.setTitle():js',

modules/angular2/test/testing/testing_public_spec.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,29 @@ export function main() {
109109
expect(el).not.toHaveCssClass('fatias');
110110
});
111111
});
112+
113+
describe('toHaveCssStyle', () => {
114+
it('should assert that the CSS style is present', () => {
115+
var el = document.createElement('div');
116+
expect(el).not.toHaveCssStyle('width');
117+
118+
el.style.setProperty('width', '100px');
119+
expect(el).toHaveCssStyle('width');
120+
});
121+
122+
it('should assert that the styles are matched against the element', () => {
123+
var el = document.createElement('div');
124+
expect(el).not.toHaveCssStyle({width: '100px', height: '555px'});
125+
126+
el.style.setProperty('width', '100px');
127+
expect(el).toHaveCssStyle({width: '100px'});
128+
expect(el).not.toHaveCssStyle({width: '100px', height: '555px'});
129+
130+
el.style.setProperty('height', '555px');
131+
expect(el).toHaveCssStyle({height: '555px'});
132+
expect(el).toHaveCssStyle({width: '100px', height: '555px'});
133+
});
134+
});
112135
});
113136

114137
describe('using the test injector with the inject helper', () => {

0 commit comments

Comments
 (0)
X Tutup