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()
 | 
						|
})
 |