You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					291 lines
				
				6.3 KiB
			
		
		
			
		
	
	
					291 lines
				
				6.3 KiB
			| 
											3 years ago
										 | import { system } from '../src' | ||
|  | 
 | ||
|  | test('returns a style parser', () => { | ||
|  |   const parser = system({ | ||
|  |     color: true, | ||
|  |     backgroundColor: { | ||
|  |       property: 'backgroundColor', | ||
|  |       scale: 'colors', | ||
|  |     }, | ||
|  |     mx: { | ||
|  |       scale: 'space', | ||
|  |       properties: ['marginLeft', 'marginRight'], | ||
|  |     }, | ||
|  |   }) | ||
|  |   expect(typeof parser).toBe('function') | ||
|  |   const styles = parser({ | ||
|  |     theme: { | ||
|  |       space: [0, 4, 8, 16, 32], | ||
|  |       colors: { | ||
|  |         primary: 'rebeccapurple', | ||
|  |       }, | ||
|  |     }, | ||
|  |     color: 'tomato', | ||
|  |     backgroundColor: 'primary', | ||
|  |     mx: [2, 3, 4], | ||
|  |   }) | ||
|  |   expect(styles).toEqual({ | ||
|  |     color: 'tomato', | ||
|  |     backgroundColor: 'rebeccapurple', | ||
|  |     marginLeft: 8, | ||
|  |     marginRight: 8, | ||
|  |     '@media screen and (min-width: 40em)': { | ||
|  |       marginLeft: 16, | ||
|  |       marginRight: 16, | ||
|  |     }, | ||
|  |     '@media screen and (min-width: 52em)': { | ||
|  |       marginLeft: 32, | ||
|  |       marginRight: 32, | ||
|  |     }, | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('merges multiple responsive styles', () => { | ||
|  |   const parser = system({ | ||
|  |     margin: true, | ||
|  |     padding: true, | ||
|  |     width: true, | ||
|  |   }) | ||
|  |   const styles = parser({ | ||
|  |     margin: [0, 4, 8], | ||
|  |     padding: [16, 32, 64], | ||
|  |     width: ['100%', '50%'], | ||
|  |   }) | ||
|  |   expect(styles).toEqual({ | ||
|  |     margin: 0, | ||
|  |     padding: 16, | ||
|  |     width: '100%', | ||
|  |     '@media screen and (min-width: 40em)': { | ||
|  |       margin: 4, | ||
|  |       padding: 32, | ||
|  |       width: '50%', | ||
|  |     }, | ||
|  |     '@media screen and (min-width: 52em)': { | ||
|  |       margin: 8, | ||
|  |       padding: 64, | ||
|  |     }, | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('merges multiple responsive object styles', () => { | ||
|  |   const parser = system({ | ||
|  |     margin: true, | ||
|  |     padding: true, | ||
|  |     width: true, | ||
|  |   }) | ||
|  |   const styles = parser({ | ||
|  |     margin: { _: 0, 0: 4, 1: 8 }, | ||
|  |     padding: { _: 16, 0: 32, 1: 64 }, | ||
|  |     width: { _: '100%', 0: '50%' }, | ||
|  |   }) | ||
|  |   expect(styles).toEqual({ | ||
|  |     margin: 0, | ||
|  |     padding: 16, | ||
|  |     width: '100%', | ||
|  |     '@media screen and (min-width: 40em)': { | ||
|  |       margin: 4, | ||
|  |       padding: 32, | ||
|  |       width: '50%', | ||
|  |     }, | ||
|  |     '@media screen and (min-width: 52em)': { | ||
|  |       margin: 8, | ||
|  |       padding: 64, | ||
|  |     }, | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('gets values from theme', () => { | ||
|  |   const parser = system({ | ||
|  |     mx: { | ||
|  |       properties: ['marginLeft', 'marginRight'], | ||
|  |       scale: 'space', | ||
|  |     }, | ||
|  |     color: { | ||
|  |       property: 'color', | ||
|  |       scale: 'colors', | ||
|  |     }, | ||
|  |   }) | ||
|  |   const style = parser({ | ||
|  |     theme: { | ||
|  |       colors: { | ||
|  |         primary: 'tomato', | ||
|  |       }, | ||
|  |       space: [0, 6, 12, 24, 48, 96], | ||
|  |     }, | ||
|  |     mx: [0, 1, 2, 3], | ||
|  |     color: ['primary', 'black'], | ||
|  |   }) | ||
|  |   expect(style).toEqual({ | ||
|  |     color: 'tomato', | ||
|  |     marginLeft: 0, | ||
|  |     marginRight: 0, | ||
|  |     '@media screen and (min-width: 40em)': { | ||
|  |       color: 'black', | ||
|  |       marginLeft: 6, | ||
|  |       marginRight: 6, | ||
|  |     }, | ||
|  |     '@media screen and (min-width: 52em)': { | ||
|  |       marginLeft: 12, | ||
|  |       marginRight: 12, | ||
|  |     }, | ||
|  |     '@media screen and (min-width: 64em)': { | ||
|  |       marginLeft: 24, | ||
|  |       marginRight: 24, | ||
|  |     }, | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('gets 0 index values from theme', () => { | ||
|  |   const parser = system({ | ||
|  |     width: { | ||
|  |       property: 'width', | ||
|  |       scale: 'sizes', | ||
|  |     } | ||
|  |   }) | ||
|  |   const style = parser({ | ||
|  |     theme: { | ||
|  |       sizes: [ 24, 48 ], | ||
|  |     }, | ||
|  |     width: 0, | ||
|  |   }) | ||
|  |   expect(style).toEqual({ width: 24 }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('ignores null values', () => { | ||
|  |   const parser = system({ | ||
|  |     color: true, | ||
|  |   }) | ||
|  |   const style = parser({ color: null }) | ||
|  |   expect(style).toEqual({}) | ||
|  | }) | ||
|  | 
 | ||
|  | test('returns a noop function with no arguments', () => { | ||
|  |   const parser = system() | ||
|  |   expect(typeof parser).toBe('function') | ||
|  | }) | ||
|  | 
 | ||
|  | test('skips null values in arrays', () => { | ||
|  |   const parser = system({ | ||
|  |     fontSize: true, | ||
|  |   }) | ||
|  |   const style = parser({ | ||
|  |     fontSize: [ 16, null, null, 18 ], | ||
|  |   }) | ||
|  |   expect(style).toEqual({ | ||
|  |     fontSize: 16, | ||
|  |     // omitting these keys cause issues when using multiple
 | ||
|  |     // responsive props together #561 #551 #549
 | ||
|  |     '@media screen and (min-width: 40em)': {}, | ||
|  |     '@media screen and (min-width: 52em)': {}, | ||
|  |     '@media screen and (min-width: 64em)': { | ||
|  |       fontSize: 18, | ||
|  |     } | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('includes single property functions', () => { | ||
|  |   const parser = system({ | ||
|  |     color: true, | ||
|  |     backgroundColor: true, | ||
|  |     width: true, | ||
|  |   }) | ||
|  |   const a = parser.color({ color: 'tomato', backgroundColor: 'nope'  }) | ||
|  |   const b = parser.width({ width: '100%', color: 'tomato', backgroundColor: 'nope'  }) | ||
|  |   expect(a).toEqual({ color: 'tomato' }) | ||
|  |   expect(b).toEqual({ width: '100%' }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('parser configs can be composed manually', () => { | ||
|  |   const color = system({ color: true, backgroundColor: true }) | ||
|  |   const layout = system({ width: true, height: true }) | ||
|  |   const composed = system({ ...color.config, ...layout.config }) | ||
|  |   const style = composed({ | ||
|  |     color: 'tomato', | ||
|  |     backgroundColor: 'black', | ||
|  |     width: '100%', | ||
|  |   }) | ||
|  |   expect(style).toEqual({ | ||
|  |     color: 'tomato', | ||
|  |     backgroundColor: 'black', | ||
|  |     width: '100%', | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('supports non-array breakpoints object', () => { | ||
|  |   const parser = system({ | ||
|  |     margin: true, | ||
|  |     padding: true, | ||
|  |     width: true, | ||
|  |   }) | ||
|  |   const styles = parser({ | ||
|  |     theme: { | ||
|  |       disableStyledSystemCache: true, | ||
|  |       breakpoints: { | ||
|  |         sm: '32em', | ||
|  |         md: '40em', | ||
|  |         lg: '64em', | ||
|  |       } | ||
|  |     }, | ||
|  |     margin: { _: 0, sm: 4, md: 8 }, | ||
|  |     padding: { _: 16, lg: 64 }, | ||
|  |   }) | ||
|  |   expect(styles).toEqual({ | ||
|  |     margin: 0, | ||
|  |     padding: 16, | ||
|  |     '@media screen and (min-width: 32em)': { | ||
|  |       margin: 4, | ||
|  |     }, | ||
|  |     '@media screen and (min-width: 40em)': { | ||
|  |       margin: 8, | ||
|  |     }, | ||
|  |     '@media screen and (min-width: 64em)': { | ||
|  |       padding: 64, | ||
|  |     }, | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('sorts media queries when responsive object values are used', () => { | ||
|  |   const parser = system({ | ||
|  |     margin: true, | ||
|  |     padding: true, | ||
|  |     color: true, | ||
|  |   }) | ||
|  |   const styles = parser({ | ||
|  |     theme: { | ||
|  |       disableStyledSystemCache: true, | ||
|  |       breakpoints: { | ||
|  |         sm: '32em', | ||
|  |         md: '40em', | ||
|  |         lg: '64em', | ||
|  |         xl: '128em', | ||
|  |       } | ||
|  |     }, | ||
|  |     padding: { _: 16, lg: 64, xl: 128 }, | ||
|  |     margin: { sm: 4, md: 8 }, | ||
|  |     color: { lg: 'tomato' }, | ||
|  |   }) | ||
|  |   expect(Object.keys(styles)).toEqual([ | ||
|  |     '@media screen and (min-width: 32em)', | ||
|  |     '@media screen and (min-width: 40em)', | ||
|  |     '@media screen and (min-width: 64em)', | ||
|  |     '@media screen and (min-width: 128em)', | ||
|  |     'padding', | ||
|  |   ]) | ||
|  | }) | ||
|  | 
 | ||
|  | test('transforms values', () => { | ||
|  |   const parser = system({ | ||
|  |     margin: { | ||
|  |       property: 'margin', | ||
|  |       transform: (n, scale, props) => { | ||
|  |         const m = props.multiply || 1 | ||
|  |         return m * n | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  |   const a = parser({ margin: 8 }) | ||
|  |   const b = parser({ margin: 12, multiply: 2 }) | ||
|  |   expect(a).toEqual({ margin: 8 }) | ||
|  |   expect(b).toEqual({ margin: 24 }) | ||
|  | }) |