/* global describe, it */
import expect from 'expect'
import NumericInput from '../src/NumericInput.jsx'
import React from 'react'
import ReactDOM from 'react-dom'
import TestUtils from 'react-dom/test-utils'
const KEYCODE_UP = 38;
const KEYCODE_DOWN = 40;
const DELAY = NumericInput.DELAY;
describe('NumericInput', function() {
this.timeout(20000);
it('works like inpit[type="number"] by default', () => {
var widget = TestUtils.renderIntoDocument();
expect(widget.refsInput.value).toEqual('');
expect(widget.refsInput.type).toEqual('text');
});
it('accepts all the props', () => {
var widget = TestUtils.renderIntoDocument(
),
inputNode = widget.refsInput;
// Test the precision
expect(inputNode.value).toEqual('5.00');
expect(inputNode.className).toEqual('form-control');
// Test the step
TestUtils.Simulate.keyDown(inputNode, { keyCode: KEYCODE_UP });
expect(inputNode.value).toEqual('5.20');
// Test the max
TestUtils.Simulate.keyDown(inputNode, { keyCode: KEYCODE_UP });
expect(inputNode.value).toEqual('5.30');
// Test the min
TestUtils.Simulate.keyDown(inputNode, { keyCode: KEYCODE_DOWN });
expect(inputNode.value).toEqual('5.10');
TestUtils.Simulate.keyDown(inputNode, { keyCode: KEYCODE_DOWN });
expect(inputNode.value).toEqual('4.90');
});
it('accepts value of 0', () => {
var widget = TestUtils.renderIntoDocument(),
inputNode = widget.refsInput;
expect(inputNode.value).toEqual('0');
});
it('accepts value of "0"', () => {
var widget = TestUtils.renderIntoDocument(),
inputNode = widget.refsInput;
expect(inputNode.value).toEqual('0');
});
it('accepts value of ""', () => {
var widget = TestUtils.renderIntoDocument(),
inputNode = widget.refsInput;
expect(inputNode.value).toEqual('');
});
it('can auto-increase', (done) => {
this.timeout
var widget = TestUtils.renderIntoDocument(),
widgetNode = ReactDOM.findDOMNode(widget),
inputNode = widgetNode.firstChild,
btnUp = inputNode.nextElementSibling;
TestUtils.Simulate.mouseDown(btnUp);
expect(inputNode.value).toEqual('1');
setTimeout(() => {
expect(inputNode.value).toEqual('2');
TestUtils.Simulate.mouseUp(btnUp);
setTimeout(() => {
expect(inputNode.value).toEqual('2');
done();
}, DELAY);
}, DELAY);
});
it('can auto-decrease', (done) => {
var widget = TestUtils.renderIntoDocument(),
widgetNode = ReactDOM.findDOMNode(widget),
inputNode = widgetNode.firstChild,
btnDown = widgetNode.lastChild;
TestUtils.Simulate.mouseDown(btnDown);
expect(inputNode.value).toEqual('-1');
setTimeout(() => {
expect(inputNode.value).toEqual('-2');
TestUtils.Simulate.mouseUp(btnDown);
setTimeout(() => {
expect(inputNode.value).toEqual('-2');
done();
}, NumericInput.SPEED);
}, DELAY);
});
it('will stop increasing on mouseleave', (done) => {
var widget = TestUtils.renderIntoDocument(),
widgetNode = ReactDOM.findDOMNode(widget),
inputNode = widgetNode.firstChild,
btnUp = inputNode.nextElementSibling;
TestUtils.Simulate.mouseDown(btnUp);
expect(inputNode.value).toEqual('1');
setTimeout(() => {
expect(inputNode.value).toEqual('2');
// TestUtils.Simulate.mouseLeave(widgetNode);
TestUtils.Simulate.mouseLeave(btnUp);
setTimeout(() => {
expect(inputNode.value).toEqual('2');
done();
}, DELAY);
}, DELAY);
});
it('will stop decreasing on mouseleave', (done) => {
var widget = TestUtils.renderIntoDocument(),
widgetNode = ReactDOM.findDOMNode(widget),
inputNode = widgetNode.firstChild,
btnDown = widgetNode.lastChild;
TestUtils.Simulate.mouseDown(btnDown);
expect(inputNode.value).toEqual('-1');
setTimeout(() => {
expect(inputNode.value).toEqual('-2');
// TestUtils.Simulate.mouseLeave(widgetNode);
TestUtils.Simulate.mouseLeave(btnDown);
setTimeout(() => {
expect(inputNode.value).toEqual('-2');
done();
}, DELAY);
}, DELAY);
});
it('uses "format" and "parse" methods', () => {
function format(n) {
return `That was ${n} days ago`;
}
function parse(s) {
return parseFloat(s.replace(/That\swas\s(\d+)\sdays\sago/gi, '$1'));
}
var widget = TestUtils.renderIntoDocument(
),
widgetNode = ReactDOM.findDOMNode(widget),
inputNode = widgetNode.firstChild;
expect(inputNode.value).toEqual('That was 5 days ago');
TestUtils.Simulate.keyDown(inputNode, { keyCode: KEYCODE_DOWN });
expect(inputNode.value).toEqual('That was 3 days ago');
inputNode.value = 'That was 13 days ago';
TestUtils.Simulate.change(inputNode);
TestUtils.Simulate.keyDown(inputNode, { keyCode: KEYCODE_UP });
expect(inputNode.value).toEqual('That was 15 days ago');
});
it('uses the "disabled" prop to disable the UI', () => {
var widget = TestUtils.renderIntoDocument(
),
widgetNode = ReactDOM.findDOMNode(widget),
inputNode = widgetNode.firstChild,
btnUp = inputNode.nextElementSibling;
expect(inputNode.disabled).toEqual(true);
expect(inputNode.readOnly).toEqual(true);
// expect(widgetNode.className).toMatch(/\bdisabled\b/);
// expect(widgetNode.className).toMatch(/\breadonly\b/);
TestUtils.Simulate.mouseDown(btnUp);
expect(inputNode.value).toEqual('');
});
// setValue() and getValueAsNumber() ---------------------------------------
it('exposes setValue() and getValueAsNumber() on the input', () => {
var widget = TestUtils.renderIntoDocument();
expect(widget.refsInput.getValueAsNumber()).toEqual(0);
widget.refsInput.setValue(123.56);
expect(widget.refsInput.getValueAsNumber()).toEqual(123.56);
});
// Testing styles ----------------------------------------------------------
it('can set wrapper styles', () => {
var widget = TestUtils.renderIntoDocument(
),
widgetNode = ReactDOM.findDOMNode(widget);
expect(widgetNode.style.fontStyle).toEqual('italic');
});
it('can set input styles', () => {
var widget = TestUtils.renderIntoDocument(
),
widgetNode = ReactDOM.findDOMNode(widget),
inputNode = widgetNode.firstChild;
expect(inputNode.style.fontStyle).toEqual('italic');
});
it('can set btnUp styles', () => {
var widget = TestUtils.renderIntoDocument(
),
widgetNode = ReactDOM.findDOMNode(widget),
btnNode = widgetNode.firstChild.nextElementSibling;
expect(btnNode.style.fontStyle).toEqual('italic');
});
it('can set btnDown styles', () => {
var widget = TestUtils.renderIntoDocument(
),
widgetNode = ReactDOM.findDOMNode(widget),
btnNode = widgetNode.lastChild;
expect(btnNode.style.fontStyle).toEqual('italic');
});
it('can set arrowDown styles', () => {
var widget = TestUtils.renderIntoDocument(
),
widgetNode = ReactDOM.findDOMNode(widget),
arrowDown = widgetNode.lastChild.firstChild;
expect(arrowDown.style.fontStyle).toEqual('italic');
});
it('can set arrowUp styles', () => {
var widget = TestUtils.renderIntoDocument(
),
widgetNode = ReactDOM.findDOMNode(widget),
arrowUp = widgetNode.firstChild.nextElementSibling.firstChild;
expect(arrowUp.style.fontStyle).toEqual('italic');
});
it('can set btn:state styles', () => {
var disabled = false;
var widget = TestUtils.renderIntoDocument(
),
widgetNode = ReactDOM.findDOMNode(widget),
btnUpNode = widgetNode.firstChild.nextElementSibling,
btnDownNode = widgetNode.lastChild;
// normal
expect(btnUpNode.style.color).toEqual('rgb(1, 2, 3)');
expect(btnDownNode.style.color).toEqual('rgb(1, 2, 3)');
// :hover
TestUtils.Simulate.mouseEnter(btnUpNode);
expect(btnUpNode.style.color).toEqual('rgb(2, 3, 4)');
TestUtils.Simulate.mouseEnter(btnDownNode);
expect(btnDownNode.style.color).toEqual('rgb(2, 3, 4)');
// :active
TestUtils.Simulate.mouseDown(btnUpNode);
expect(btnUpNode.style.color).toEqual('rgb(3, 4, 5)');
TestUtils.Simulate.mouseDown(btnDownNode);
expect(btnDownNode.style.color).toEqual('rgb(3, 4, 5)');
// :disabled
widget = TestUtils.renderIntoDocument(
);
widgetNode = ReactDOM.findDOMNode(widget);
btnUpNode = widgetNode.firstChild.nextElementSibling;
btnDownNode = widgetNode.lastChild;
expect(btnUpNode.style.color).toEqual('rgb(4, 5, 6)');
expect(btnDownNode.style.color).toEqual('rgb(4, 5, 6)');
TestUtils.Simulate.mouseEnter(btnUpNode);
expect(btnUpNode.style.color).toEqual('rgb(4, 5, 6)');
TestUtils.Simulate.mouseEnter(btnDownNode);
expect(btnDownNode.style.color).toEqual('rgb(4, 5, 6)');
TestUtils.Simulate.mouseDown(btnUpNode);
expect(btnUpNode.style.color).toEqual('rgb(4, 5, 6)');
TestUtils.Simulate.mouseDown(btnDownNode);
expect(btnDownNode.style.color).toEqual('rgb(4, 5, 6)');
});
it ('can set mobile styles', () => {
var widget = TestUtils.renderIntoDocument(),
widgetNode = ReactDOM.findDOMNode(widget),
btnUpNode = widgetNode.firstChild.nextElementSibling,
btnDownNode = widgetNode.lastChild;
expect(btnUpNode.style.bottom).toEqual('2px');
expect(btnDownNode.style.left).toEqual('2px');
widget = TestUtils.renderIntoDocument(),
widgetNode = ReactDOM.findDOMNode(widget),
btnUpNode = widgetNode.firstChild.nextElementSibling,
btnDownNode = widgetNode.lastChild;
expect(btnUpNode.style.bottom).toEqual('50%');
expect(btnDownNode.style.top).toEqual('50%');
});
it("calls it's onChange callback properly", () => {
var value = null, stringValue = "";
function onChange(valueAsNumber, valueAsString) {
value = valueAsNumber
stringValue = valueAsString
}
function format(val) {
return val * 100 + 'x';
}
var widget = TestUtils.renderIntoDocument(
),
widgetNode = ReactDOM.findDOMNode(widget),
btnUpNode = widgetNode.firstChild.nextElementSibling,
inputNode = widget.refsInput;
expect(inputNode.value).toEqual('0x');
expect(value).toEqual(null);
TestUtils.Simulate.mouseDown(btnUpNode);
expect(inputNode.value).toEqual('100x');
expect(stringValue).toEqual('100x');
expect(value).toEqual(1);
});
it("calls it's onFocus and onBlur callbacks", () => {
var hasFocus = null;
function onFocus() {
hasFocus = true;
}
function onBlur() {
hasFocus = false;
}
var widget = TestUtils.renderIntoDocument(
),
inputNode = widget.refsInput;
expect(hasFocus).toEqual(null);
TestUtils.Simulate.focus(inputNode);
expect(hasFocus).toEqual(true);
TestUtils.Simulate.blur(inputNode);
expect(hasFocus).toEqual(false);
});
it("calls it's onKeyDown callbacks and makest the event cancelable", () => {
var hits = 0, widget, inputNode;
function onKeyDown(e) {
expect(e.target).toEqual(inputNode);
if (hits > 0) {
e.preventDefault()
}
hits++;
}
widget = TestUtils.renderIntoDocument(
);
inputNode = widget.refsInput;
expect(hits).toEqual(0);
expect(inputNode.value).toEqual('0');
TestUtils.Simulate.keyDown(inputNode, { keyCode: KEYCODE_UP });
expect(hits).toEqual(1);
expect(inputNode.value).toEqual('1');
TestUtils.Simulate.keyDown(inputNode, { keyCode: KEYCODE_UP });
expect(hits).toEqual(2);
expect(inputNode.value).toEqual('1');
});
});