import { h, render, Component } from '../../src/preact';
/** @jsx h */
// gives call count and argument errors names (otherwise sinon just uses "spy"):
let spy = (name, ...args) => {
	let spy = sinon.spy(...args);
	spy.displayName = `spy('${name}')`;
	return spy;
};
describe('refs', () => {
	let scratch;
	before( () => {
		scratch = document.createElement('div');
		(document.body || document.documentElement).appendChild(scratch);
	});
	beforeEach( () => {
		scratch.innerHTML = '';
	});
	after( () => {
		scratch.parentNode.removeChild(scratch);
		scratch = null;
	});
	it('should invoke refs in render()', () => {
		let ref = spy('ref');
		render(
 this.outer=c }>
						
 this.inner=c } />
					
				);
			}
		}
		sinon.spy(TestUnmount.prototype, 'componentWillUnmount');
		sinon.spy(TestUnmount.prototype, 'componentDidUnmount');
		root = render(
, scratch, root);
		outer = scratch.querySelector('#outer');
		inner = scratch.querySelector('#inner');
		expect(TestUnmount.prototype.componentWillUnmount).not.to.have.been.called;
		expect(TestUnmount.prototype.componentDidUnmount).not.to.have.been.called;
		root = render(
, scratch, root);
		expect(TestUnmount.prototype.componentWillUnmount).to.have.been.calledOnce;
		expect(TestUnmount.prototype.componentDidUnmount).to.have.been.calledOnce;
	});
	it('should null and re-invoke refs when swapping component root element type', () => {
		let inst;
		class App extends Component {
			render() {
				return 
;
			}
		}
		class Child extends Component {
			constructor(props, context) {
				super(props, context);
				this.state = { show:false };
				inst = this;
			}
			handleMount(){}
			render(_, { show }) {
				if (!show) return 
;
				return 
some test content;
			}
		}
		sinon.spy(Child.prototype, 'handleMount');
		render(
, scratch);
		expect(inst.handleMount).to.have.been.calledOnce.and.calledWith(scratch.querySelector('#div'));
		inst.handleMount.reset();
		inst.setState({ show:true });
		inst.forceUpdate();
		expect(inst.handleMount).to.have.been.calledTwice;
		expect(inst.handleMount.firstCall).to.have.been.calledWith(null);
		expect(inst.handleMount.secondCall).to.have.been.calledWith(scratch.querySelector('#span'));
		inst.handleMount.reset();
		inst.setState({ show:false });
		inst.forceUpdate();
		expect(inst.handleMount).to.have.been.calledTwice;
		expect(inst.handleMount.firstCall).to.have.been.calledWith(null);
		expect(inst.handleMount.secondCall).to.have.been.calledWith(scratch.querySelector('#div'));
	});
});