diff --git a/package.json b/package.json index 7c736363..6de3bf97 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "browserify": "^14.3.0", "codemirror": "^5.13.4", "eslint": "^4.1.1", + "fast-check": "0.0.13", "istanbul": "^0.4.5", "mocha": "^3.3.0", "uglify-js": "^3.0.1" diff --git a/test/25-dumper-fuzzy.js b/test/25-dumper-fuzzy.js new file mode 100644 index 00000000..4dc53994 --- /dev/null +++ b/test/25-dumper-fuzzy.js @@ -0,0 +1,47 @@ +'use strict'; + +var assert = require('assert'); +var fc = require('fast-check'); +var yaml = require('../'); + +// Generate valid YAML instances for yaml.safeDump +var key = fc.string16bits(); +var values = [ + key, fc.boolean(), fc.integer(), fc.double(), + fc.constantFrom(null, Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY) +]; +var yamlArbitrary = fc.object({ key: key, values: values }); + +// Generate valid options for yaml.safeDump configuration +var dumpOptionsArbitrary = fc.record({ + skipInvalid: fc.boolean(), + sortKeys: fc.boolean(), + noRefs: fc.boolean(), + noCompatMode: fc.boolean(), + condenseFlow: fc.boolean(), + indent: fc.integer(1, 80), + flowLevel: fc.integer(-1, 10), + styles: fc.record({ + '!!null': fc.constantFrom('lowercase', 'canonical', 'uppercase', 'camelcase'), + '!!int': fc.constantFrom('decimal', 'binary', 'octal', 'hexadecimal'), + '!!bool': fc.constantFrom('lowercase', 'uppercase', 'camelcase'), + '!!float': fc.constantFrom('lowercase', 'uppercase', 'camelcase') + }, { with_deleted_keys: true }) +}, { with_deleted_keys: true }) + .map(function (instance) { + if (instance.condenseFlow === true && instance.flowLevel !== undefined) { instance.flowLevel = -1; } + return instance; + }); + +suite('Properties', function () { + test('Load from dumped should be the original object', function () { + fc.assert(fc.property( + yamlArbitrary, + dumpOptionsArbitrary, + function (obj, dumpOptions) { + var yamlContent = yaml.safeDump(obj, dumpOptions); + assert.ok(typeof yamlContent === 'string'); + assert.deepStrictEqual(yaml.safeLoad(yamlContent), obj); + })); + }); +});