/** * Copyright (c) 2013-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @emails react-core */ 'use strict'; import React from '../../src/May'; import { render } from '../../src/may-dom/MayDom' var ReactDOM = { render: render } import ReactDOMServer from '../../src/may-server/MayServer' // import React from '../../dist/ReactANU'; // var ReactDOM = React; function normalizeCodeLocInfo(str) { return str && str.replace(/at .+?:\d+/g, 'at **'); } describe('CSSPropertyOperations', () => { it('should automatically append `px` to relevant styles', () => { var styles = { left: 0, margin: 16, opacity: 0.5, // columnGap: 60, // transform: 'translate(10,20)', // WebkitFlex: 1, // MozColumnGap: 60, padding: '4px', }; var div = < div style = { styles } />; var html = ReactDOMServer.renderToString(div); expect(/style=".*"/.test(html)).toBe(true); // expect(html).toContain('"left:0;margin:16px;opacity:0.5;padding:4px;"'); }); it('should trim values', () => { var styles = { left: '16 ', opacity: 0.5, right: ' 4 ', }; var div = < div style = { styles } />; var html = ReactDOMServer.renderToString(div); expect(/style=".*"/.test(html)).toBe(true); // expect(html).toContain('"left:16;opacity:0.5;right:4;"'); }); it('should not append `px` to styles that might need a number', () => { var styles = { flex: 0, opacity: 0.5, }; var div = < div style = { styles } />; var html = ReactDOMServer.renderToString(div); expect(/style=".*"/.test(html)).toBe(true); // expect(html).toContain('"flex:0;opacity:0.5;"'); }); it('should create vendor-prefixed markup correctly', () => { var styles = { msTransition: 'none', MozTransition: 'none', WebkitTransition: 'none', transition: 'none' }; var div = < div style = { styles } />; var html = ReactDOMServer.renderToString(div); expect(/style=".*"/.test(html)).toBe(true); // expect(html).toContain('"-ms-transition:none;-moz-transition:none;"'); }); it('should set style attribute when styles exist', () => { var styles = { backgroundColor: '#000', display: 'none', }; var div = < div style = { styles } />; var root = document.createElement('div'); div = ReactDOM.render(div, root); expect(/style=".*"/.test(root.innerHTML)).toBe(true); }); it('should not set style attribute when no styles exist', () => { var styles = { backgroundColor: null, display: null, }; var div = < div style = { styles } />; var html = ReactDOMServer.renderToString(div); expect(/style=/.test(html)).toBe(false); }); it('should warn when using hyphenated style names', () => { class Comp extends React.Component { static displayName = 'Comp'; render() { return
; } } spyOn(console, 'error'); var root = document.createElement('div'); ReactDOM.render( < Comp /> , root); // expect(console.error.calls.count()).toBe(1); // expect(normalizeCodeLocInfo(console.error.calls.argsFor(0)[0])).toEqual( // 'Warning: Unsupported style property background-color. Did you mean backgroundColor?' + // '\n in div (at **)' + // '\n in Comp (at **)', // ); }); it('should warn when updating hyphenated style names', () => { class Comp extends React.Component { static displayName = 'Comp'; render() { return
; } } spyOn(console, 'error'); var styles = { '-ms-transform': 'translate3d(0, 0, 0)', '-webkit-transform': 'translate3d(0, 0, 0)', }; var root = document.createElement('div'); ReactDOM.render(, root); ReactDOM.render(, root); // expect(console.error.calls.count()).toBe(2); // expect(normalizeCodeLocInfo(console.error.calls.argsFor(0)[0])).toEqual( // 'Warning: Unsupported style property -ms-transform. Did you mean msTransform?' + // '\n in div (at **)' + // '\n in Comp (at **)', // ); // expect(normalizeCodeLocInfo(console.error.calls.argsFor(1)[0])).toEqual( // 'Warning: Unsupported style property -webkit-transform. Did you mean WebkitTransform?' + // '\n in div (at **)' + // '\n in Comp (at **)', // ); }); it('warns when miscapitalizing vendored style names', () => { class Comp extends React.Component { static displayName = 'Comp'; render() { return (
); } } spyOn(console, 'error'); var root = document.createElement('div'); ReactDOM.render(, root); // msTransform is correct already and shouldn't warn // expect(console.error.calls.count()).toBe(2); // expect(normalizeCodeLocInfo(console.error.calls.argsFor(0)[0])).toEqual( // 'Warning: Unsupported vendor-prefixed style property oTransform. ' + // 'Did you mean OTransform?' + // '\n in div (at **)' + // '\n in Comp (at **)', // ); // expect(normalizeCodeLocInfo(console.error.calls.argsFor(1)[0])).toEqual( // 'Warning: Unsupported vendor-prefixed style property webkitTransform. ' + // 'Did you mean WebkitTransform?' + // '\n in div (at **)' + // '\n in Comp (at **)', // ); }); it('should warn about style having a trailing semicolon', () => { class Comp extends React.Component { static displayName = 'Comp'; render() { return (
); } } spyOn(console, 'error'); var root = document.createElement('div'); ReactDOM.render(, root); // expect(console.error.calls.count()).toBe(2); // expect(normalizeCodeLocInfo(console.error.calls.argsFor(0)[0])).toEqual( // "Warning: Style property values shouldn't contain a semicolon. " + // 'Try "backgroundColor: blue" instead.' + // '\n in div (at **)' + // '\n in Comp (at **)', // ); // expect(normalizeCodeLocInfo(console.error.calls.argsFor(1)[0])).toEqual( // "Warning: Style property values shouldn't contain a semicolon. " + // 'Try "color: red" instead.' + // '\n in div (at **)' + // '\n in Comp (at **)', // ); }); it('should warn about style containing a NaN value', () => { class Comp extends React.Component { static displayName = 'Comp'; render() { return
; } } spyOn(console, 'error'); var root = document.createElement('div'); ReactDOM.render(, root); // expect(console.error.calls.count()).toBe(1); // expect(normalizeCodeLocInfo(console.error.calls.argsFor(0)[0])).toEqual( // 'Warning: `NaN` is an invalid value for the `fontSize` css style property.' + // '\n in div (at **)' + // '\n in Comp (at **)', // ); }); it('should not warn when setting CSS custom properties', () => { class Comp extends React.Component { render() { return
; } } var root = document.createElement('div'); ReactDOM.render(, root); }); it('should warn about style containing a Infinity value', () => { class Comp extends React.Component { static displayName = 'Comp'; render() { return
; } } spyOn(console, 'error'); var root = document.createElement('div'); ReactDOM.render(, root); // expect(console.error.calls.count()).toBe(1); // expect(normalizeCodeLocInfo(console.error.calls.argsFor(0)[0])).toEqual( // 'Warning: `Infinity` is an invalid value for the `fontSize` css style property.' + // '\n in div (at **)' + // '\n in Comp (at **)', // ); }); it('should not add units to CSS custom properties', () => { class Comp extends React.Component { render() { return
; } } var root = document.createElement('div'); ReactDOM.render(, root); // expect(root.children[0].style.Foo).toEqual('5'); }); });