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.
		
		
		
		
		
			
		
			
				
					
					
						
							321 lines
						
					
					
						
							5.9 KiB
						
					
					
				
			
		
		
	
	
							321 lines
						
					
					
						
							5.9 KiB
						
					
					
				| 'use strict'
 | |
| 
 | |
| const t = require('tap')
 | |
| const build = require('..')
 | |
| 
 | |
| const schema = {
 | |
|   type: 'object',
 | |
|   properties: {
 | |
|   },
 | |
|   if: {
 | |
|     properties: {
 | |
|       kind: { type: 'string', enum: ['foobar'] }
 | |
|     }
 | |
|   },
 | |
|   then: {
 | |
|     properties: {
 | |
|       kind: { type: 'string', enum: ['foobar'] },
 | |
|       foo: { type: 'string' },
 | |
|       bar: { type: 'number' },
 | |
|       list: {
 | |
|         type: 'array',
 | |
|         items: {
 | |
|           type: 'object',
 | |
|           properties: {
 | |
|             name: { type: 'string' },
 | |
|             value: { type: 'string' }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   },
 | |
|   else: {
 | |
|     properties: {
 | |
|       kind: { type: 'string', enum: ['greeting'] },
 | |
|       hi: { type: 'string' },
 | |
|       hello: { type: 'number' },
 | |
|       list: {
 | |
|         type: 'array',
 | |
|         items: {
 | |
|           type: 'object',
 | |
|           properties: {
 | |
|             name: { type: 'string' },
 | |
|             value: { type: 'string' }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| const nestedIfSchema = {
 | |
|   type: 'object',
 | |
|   properties: { },
 | |
|   if: {
 | |
|     properties: {
 | |
|       kind: { type: 'string', enum: ['foobar', 'greeting'] }
 | |
|     }
 | |
|   },
 | |
|   then: {
 | |
|     if: {
 | |
|       properties: {
 | |
|         kind: { type: 'string', enum: ['foobar'] }
 | |
|       }
 | |
|     },
 | |
|     then: {
 | |
|       properties: {
 | |
|         kind: { type: 'string', enum: ['foobar'] },
 | |
|         foo: { type: 'string' },
 | |
|         bar: { type: 'number' },
 | |
|         list: {
 | |
|           type: 'array',
 | |
|           items: {
 | |
|             type: 'object',
 | |
|             properties: {
 | |
|               name: { type: 'string' },
 | |
|               value: { type: 'string' }
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     },
 | |
|     else: {
 | |
|       properties: {
 | |
|         kind: { type: 'string', enum: ['greeting'] },
 | |
|         hi: { type: 'string' },
 | |
|         hello: { type: 'number' }
 | |
|       }
 | |
|     }
 | |
|   },
 | |
|   else: {
 | |
|     properties: {
 | |
|       kind: { type: 'string', enum: ['alphabet'] },
 | |
|       a: { type: 'string' },
 | |
|       b: { type: 'number' }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| const nestedElseSchema = {
 | |
|   type: 'object',
 | |
|   properties: { },
 | |
|   if: {
 | |
|     properties: {
 | |
|       kind: { type: 'string', enum: ['foobar'] }
 | |
|     }
 | |
|   },
 | |
|   then: {
 | |
|     properties: {
 | |
|       kind: { type: 'string', enum: ['foobar'] },
 | |
|       foo: { type: 'string' },
 | |
|       bar: { type: 'number' },
 | |
|       list: {
 | |
|         type: 'array',
 | |
|         items: {
 | |
|           type: 'object',
 | |
|           properties: {
 | |
|             name: { type: 'string' },
 | |
|             value: { type: 'string' }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   },
 | |
|   else: {
 | |
|     if: {
 | |
|       properties: {
 | |
|         kind: { type: 'string', enum: ['greeting'] }
 | |
|       }
 | |
|     },
 | |
|     then: {
 | |
|       properties: {
 | |
|         kind: { type: 'string', enum: ['greeting'] },
 | |
|         hi: { type: 'string' },
 | |
|         hello: { type: 'number' }
 | |
|       }
 | |
|     },
 | |
|     else: {
 | |
|       properties: {
 | |
|         kind: { type: 'string', enum: ['alphabet'] },
 | |
|         a: { type: 'string' },
 | |
|         b: { type: 'number' }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| const nestedDeepElseSchema = {
 | |
|   type: 'object',
 | |
|   additionalProperties: schema
 | |
| }
 | |
| 
 | |
| const noElseSchema = {
 | |
|   type: 'object',
 | |
|   properties: {
 | |
|   },
 | |
|   if: {
 | |
|     properties: {
 | |
|       kind: { type: 'string', enum: ['foobar'] }
 | |
|     }
 | |
|   },
 | |
|   then: {
 | |
|     properties: {
 | |
|       kind: { type: 'string', enum: ['foobar'] },
 | |
|       foo: { type: 'string' },
 | |
|       bar: { type: 'number' },
 | |
|       list: {
 | |
|         type: 'array',
 | |
|         items: {
 | |
|           type: 'object',
 | |
|           properties: {
 | |
|             name: { type: 'string' },
 | |
|             value: { type: 'string' }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| const fooBarInput = {
 | |
|   kind: 'foobar',
 | |
|   foo: 'FOO',
 | |
|   list: [{
 | |
|     name: 'name',
 | |
|     value: 'foo'
 | |
|   }],
 | |
|   bar: 42,
 | |
|   hi: 'HI',
 | |
|   hello: 45,
 | |
|   a: 'A',
 | |
|   b: 35
 | |
| }
 | |
| const greetingInput = {
 | |
|   kind: 'greeting',
 | |
|   foo: 'FOO',
 | |
|   bar: 42,
 | |
|   hi: 'HI',
 | |
|   hello: 45,
 | |
|   a: 'A',
 | |
|   b: 35
 | |
| }
 | |
| const alphabetInput = {
 | |
|   kind: 'alphabet',
 | |
|   foo: 'FOO',
 | |
|   bar: 42,
 | |
|   hi: 'HI',
 | |
|   hello: 45,
 | |
|   a: 'A',
 | |
|   b: 35
 | |
| }
 | |
| const deepFoobarInput = {
 | |
|   foobar: fooBarInput
 | |
| }
 | |
| const foobarOutput = JSON.stringify({
 | |
|   kind: 'foobar',
 | |
|   foo: 'FOO',
 | |
|   bar: 42,
 | |
|   list: [{
 | |
|     name: 'name',
 | |
|     value: 'foo'
 | |
|   }]
 | |
| })
 | |
| const greetingOutput = JSON.stringify({
 | |
|   kind: 'greeting',
 | |
|   hi: 'HI',
 | |
|   hello: 45
 | |
| })
 | |
| const alphabetOutput = JSON.stringify({
 | |
|   kind: 'alphabet',
 | |
|   a: 'A',
 | |
|   b: 35
 | |
| })
 | |
| const deepFoobarOutput = JSON.stringify({
 | |
|   foobar: JSON.parse(foobarOutput)
 | |
| })
 | |
| const noElseGreetingOutput = JSON.stringify({
 | |
|   kind: 'greeting',
 | |
|   foo: 'FOO',
 | |
|   bar: 42,
 | |
|   hi: 'HI',
 | |
|   hello: 45,
 | |
|   a: 'A',
 | |
|   b: 35
 | |
| })
 | |
| 
 | |
| t.test('if-then-else', t => {
 | |
|   const tests = [
 | |
|     {
 | |
|       name: 'foobar',
 | |
|       schema: schema,
 | |
|       input: fooBarInput,
 | |
|       expected: foobarOutput
 | |
|     },
 | |
|     {
 | |
|       name: 'greeting',
 | |
|       schema: schema,
 | |
|       input: greetingInput,
 | |
|       expected: greetingOutput
 | |
|     },
 | |
|     {
 | |
|       name: 'if nested - then then',
 | |
|       schema: nestedIfSchema,
 | |
|       input: fooBarInput,
 | |
|       expected: foobarOutput
 | |
|     },
 | |
|     {
 | |
|       name: 'if nested - then else',
 | |
|       schema: nestedIfSchema,
 | |
|       input: greetingInput,
 | |
|       expected: greetingOutput
 | |
|     },
 | |
|     {
 | |
|       name: 'if nested - else',
 | |
|       schema: nestedIfSchema,
 | |
|       input: alphabetInput,
 | |
|       expected: alphabetOutput
 | |
|     },
 | |
|     {
 | |
|       name: 'else nested - then',
 | |
|       schema: nestedElseSchema,
 | |
|       input: fooBarInput,
 | |
|       expected: foobarOutput
 | |
|     },
 | |
|     {
 | |
|       name: 'else nested - else then',
 | |
|       schema: nestedElseSchema,
 | |
|       input: greetingInput,
 | |
|       expected: greetingOutput
 | |
|     },
 | |
|     {
 | |
|       name: 'else nested - else else',
 | |
|       schema: nestedElseSchema,
 | |
|       input: alphabetInput,
 | |
|       expected: alphabetOutput
 | |
|     },
 | |
|     {
 | |
|       name: 'deep then - else',
 | |
|       schema: nestedDeepElseSchema,
 | |
|       input: deepFoobarInput,
 | |
|       expected: deepFoobarOutput
 | |
|     },
 | |
|     {
 | |
|       name: 'no else',
 | |
|       schema: noElseSchema,
 | |
|       input: greetingInput,
 | |
|       expected: noElseGreetingOutput
 | |
|     }
 | |
|   ]
 | |
| 
 | |
|   tests.forEach(test => {
 | |
|     t.test(test.name + ' - normal', t => {
 | |
|       t.plan(1)
 | |
| 
 | |
|       const stringify = build(JSON.parse(JSON.stringify(test.schema)))
 | |
|       const serialized = stringify(test.input)
 | |
|       t.equal(serialized, test.expected)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   t.end()
 | |
| })
 |