aboutsummaryrefslogtreecommitdiff
path: root/thirdparty/preact/test/browser/spec.js
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/preact/test/browser/spec.js')
-rw-r--r--thirdparty/preact/test/browser/spec.js124
1 files changed, 124 insertions, 0 deletions
diff --git a/thirdparty/preact/test/browser/spec.js b/thirdparty/preact/test/browser/spec.js
new file mode 100644
index 000000000..eb48151f0
--- /dev/null
+++ b/thirdparty/preact/test/browser/spec.js
@@ -0,0 +1,124 @@
+import { h, render, rerender, Component } from '../../src/preact';
+/** @jsx h */
+
+describe('Component spec', () => {
+ let scratch;
+
+ before( () => {
+ scratch = document.createElement('div');
+ (document.body || document.documentElement).appendChild(scratch);
+ });
+
+ beforeEach( () => {
+ scratch.innerHTML = '';
+ });
+
+ after( () => {
+ scratch.parentNode.removeChild(scratch);
+ scratch = null;
+ });
+
+ describe('defaultProps', () => {
+ it('should apply default props on initial render', () => {
+ class WithDefaultProps extends Component {
+ constructor(props, context) {
+ super(props, context);
+ expect(props).to.be.deep.equal({
+ fieldA: 1, fieldB: 2,
+ fieldC: 1, fieldD: 2
+ });
+ }
+ render() {
+ return <div />;
+ }
+ }
+ WithDefaultProps.defaultProps = { fieldC: 1, fieldD: 1 };
+ render(<WithDefaultProps fieldA={1} fieldB={2} fieldD={2} />, scratch);
+ });
+
+ it('should apply default props on rerender', () => {
+ let doRender;
+ class Outer extends Component {
+ constructor() {
+ super();
+ this.state = { i:1 };
+ }
+ componentDidMount() {
+ doRender = () => this.setState({ i: 2 });
+ }
+ render(props, { i }) {
+ return <WithDefaultProps fieldA={1} fieldB={i} fieldD={i} />;
+ }
+ }
+ class WithDefaultProps extends Component {
+ constructor(props, context) {
+ super(props, context);
+ this.ctor(props, context);
+ }
+ ctor(){}
+ componentWillReceiveProps() {}
+ render() {
+ return <div />;
+ }
+ }
+ WithDefaultProps.defaultProps = { fieldC: 1, fieldD: 1 };
+
+ let proto = WithDefaultProps.prototype;
+ sinon.spy(proto, 'ctor');
+ sinon.spy(proto, 'componentWillReceiveProps');
+ sinon.spy(proto, 'render');
+
+ render(<Outer />, scratch);
+ doRender();
+
+ const PROPS1 = {
+ fieldA: 1, fieldB: 1,
+ fieldC: 1, fieldD: 1
+ };
+
+ const PROPS2 = {
+ fieldA: 1, fieldB: 2,
+ fieldC: 1, fieldD: 2
+ };
+
+ expect(proto.ctor).to.have.been.calledWith(PROPS1);
+ expect(proto.render).to.have.been.calledWith(PROPS1);
+
+ rerender();
+
+ // expect(proto.ctor).to.have.been.calledWith(PROPS2);
+ expect(proto.componentWillReceiveProps).to.have.been.calledWith(PROPS2);
+ expect(proto.render).to.have.been.calledWith(PROPS2);
+ });
+
+ // @TODO: migrate this to preact-compat
+ xit('should cache default props', () => {
+ class WithDefaultProps extends Component {
+ constructor(props, context) {
+ super(props, context);
+ expect(props).to.be.deep.equal({
+ fieldA: 1, fieldB: 2,
+ fieldC: 1, fieldD: 2,
+ fieldX: 10
+ });
+ }
+ getDefaultProps() {
+ return { fieldA: 1, fieldB: 1 };
+ }
+ render() {
+ return <div />;
+ }
+ }
+ WithDefaultProps.defaultProps = { fieldC: 1, fieldD: 1 };
+ sinon.spy(WithDefaultProps.prototype, 'getDefaultProps');
+ render((
+ <div>
+ <WithDefaultProps fieldB={2} fieldD={2} fieldX={10} />
+ <WithDefaultProps fieldB={2} fieldD={2} fieldX={10} />
+ <WithDefaultProps fieldB={2} fieldD={2} fieldX={10} />
+ </div>
+ ), scratch);
+ expect(WithDefaultProps.prototype.getDefaultProps).to.be.calledOnce;
+ });
+ });
+});