diff --git a/.travis.yml b/.travis.yml index f36f26157..5eea68116 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ os: - linux - osx -osx_image: xcode8.3 language: cpp compiler: g++ git: @@ -21,7 +20,9 @@ addons: - g++-5 - cmake - cmake-data -script: mkdir build && cd build && cmake -Dtest=ON .. && make && make test +script: +- mkdir build && cd build && cmake -Dtest=ON .. && make && make test +- if [ "$TRAVIS_OS_NAME" == "linux" ]; then cd ../test/js && npm i -g npm && npm install && npm run test && cd ../../build; fi after_success: - if [ ! -z "$TRAVIS_TAG" ]; then export RELEASE=`echo "$TRAVIS_TAG"| awk -F"-" '{print $1}'`; diff --git a/CMakeLists.txt b/CMakeLists.txt index aced3acbe..95d8da9c5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -101,6 +101,7 @@ include_directories(dependencies/OpenCOLLADA/OpenCOLLADA/COLLADASaxFrameworkLoad include_directories(dependencies/OpenCOLLADA/OpenCOLLADA/COLLADABaseUtils/include) include_directories(dependencies/OpenCOLLADA/OpenCOLLADA/COLLADAFramework/include) include_directories(dependencies/OpenCOLLADA/OpenCOLLADA/GeneratedSaxParser/include) +include_directories(dependencies/OpenCOLLADA/OpenCOLLADA/Externals/pcre/include) if(NOT OpenCOLLADA) add_subdirectory(dependencies/OpenCOLLADA/modules/COLLADASaxFrameworkLoader) set(OpenCOLLADA COLLADASaxFrameworkLoader) diff --git a/dependencies/OpenCOLLADA/modules/COLLADASaxFrameworkLoader/COLLADAFramework/CMakeLists.txt b/dependencies/OpenCOLLADA/modules/COLLADASaxFrameworkLoader/COLLADAFramework/CMakeLists.txt index 3ed88fced..667120115 100644 --- a/dependencies/OpenCOLLADA/modules/COLLADASaxFrameworkLoader/COLLADAFramework/CMakeLists.txt +++ b/dependencies/OpenCOLLADA/modules/COLLADASaxFrameworkLoader/COLLADAFramework/CMakeLists.txt @@ -20,5 +20,8 @@ include_directories(${BASE_PATH}/Externals/MathMLSolver/include) include_directories(${BASE_PATH}/Externals/MathMLSolver/include/AST) add_subdirectory(MathMLSolver) +# pcre +include_directories(${BASE_PATH}/Externals/pcre/include) + add_library(${PROJECT_NAME} ${HEADERS} ${SOURCES}) target_link_libraries(${PROJECT_NAME} COLLADABaseUtils MathMLSolver) diff --git a/test/js/.gitignore b/test/js/.gitignore new file mode 100644 index 000000000..b512c09d4 --- /dev/null +++ b/test/js/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/test/js/README.md b/test/js/README.md new file mode 100644 index 000000000..be82fdcf3 --- /dev/null +++ b/test/js/README.md @@ -0,0 +1,29 @@ +# COLLADA2GLTF E2E Validation +This subproject implements COLLADA2GLTF end-to-end validation. + +COLLADA source models are pulled from the +[glTF-Sample-Models](https://github.com/KhronosGroup/glTF-Sample-Models) +repository and the built converter binary is used to convert them to glTF. + +The +[glTF-Validator](https://github.com/KhronosGroup/glTF-Validator) +is then used to validate the converted models, to make sure that they: + * Have the expected number of primitives + * Use the expected glTF features: + * Animations + * Morph Targets + * Skins + * Textures + * Have no: + * Errors + * Infos + * Warnings + +These tests are implemented as a set of ES6 Mocha tests. You can run them +with: + +```bash +npm install + +npm run test +``` diff --git a/test/js/package-lock.json b/test/js/package-lock.json new file mode 100644 index 000000000..a57b3c3a1 --- /dev/null +++ b/test/js/package-lock.json @@ -0,0 +1,251 @@ +{ + "name": "collada2gltf-test", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "chai-subset": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/chai-subset/-/chai-subset-1.6.0.tgz", + "integrity": "sha1-pdDKFOMpp5WW7XAFi2ZGvWmIz+k=" + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "requires": { + "type-detect": "^4.0.0" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esm": { + "version": "3.0.84", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.0.84.tgz", + "integrity": "sha512-SzSGoZc17S7P+12R9cg21Bdb7eybX25RnIeRZ80xZs+VZ3kdQKzqTp2k4hZJjR7p9l0186TTXSgrxzlMDBktlw==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "gltf-validator": { + "version": "2.0.0-dev.2.7", + "resolved": "https://registry.npmjs.org/gltf-validator/-/gltf-validator-2.0.0-dev.2.7.tgz", + "integrity": "sha512-OmI/inmNEL9uDTxj6KNF+/oZ7df2okhi1HKMV7cjakzo2k/MFKpa95R4dMG6WQx1KaiZAG7hvdpSxvjtkTyb2A==" + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/test/js/package.json b/test/js/package.json new file mode 100644 index 000000000..4d489b1d0 --- /dev/null +++ b/test/js/package.json @@ -0,0 +1,20 @@ +{ + "name": "collada2gltf-test", + "version": "1.0.0", + "description": "Integration testing COLLADA2GLTF converter", + "scripts": { + "test": "mocha -r esm" + }, + "author": "Rob Taglang", + "license": "BSD", + "devDependencies": {}, + "dependencies": { + "bluebird": "^3.5.3", + "chai": "^4.2.0", + "chai-subset": "^1.6.0", + "esm": "^3.0.84", + "gltf-validator": "^2.0.0-dev.2.7", + "mocha": "^5.2.0", + "tmp": "0.0.33" + } +} diff --git a/test/js/test/validate.js b/test/js/test/validate.js new file mode 100644 index 000000000..e5b437f74 --- /dev/null +++ b/test/js/test/validate.js @@ -0,0 +1,343 @@ +import {expect} from 'chai' +import chai from 'chai' +import chaiSubset from 'chai-subset' +import child_process from 'child_process' +import fs from 'fs' +import https from 'https' +import path from 'path' +import Promise from 'bluebird' +import tmp from 'tmp' +import validator from 'gltf-validator' + +chai.use(chaiSubset) + +const execPromise = Promise.promisify(child_process.execFile) + +const SAMPLE_MODELS_BASE_URL = 'https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/sourceModels/' +const COLLADA2GLTF_PATH = '../../build/COLLADA2GLTF-bin' + +async function convert(collada_url) { + const tmpDir = tmp.dirSync({ + unsafeCleanup: true + }) + try { + const dirName = tmpDir.name + const fileName = collada_url.split('/').pop() + const targetFileName = path.join(dirName, fileName) + const targetStream = fs.createWriteStream(targetFileName) + https.get(collada_url, (res) => { + res.pipe(targetStream) + }) + await new Promise((resolve, reject) => { + targetStream.on('finish', () => { + targetStream.close() + resolve() + }) + }) + const collada = fs.readFileSync(targetFileName, 'UTF-8') + const stdout = await execPromise(COLLADA2GLTF_PATH, [targetFileName]) + const outputFileName = path.join(dirName, 'output', fileName.replace('.dae', '.gltf')) + return fs.readFileSync(outputFileName) + } finally { + tmpDir.removeCallback() + } +} + +async function validate(asset, expected) { + const report = await validator.validateBytes(new Uint8Array(asset)) + expect(report).to.containSubset(expected) + return report +} + +describe('Test and validate model conversions', () => { + it('AnimatedMorphCube', async () => { + const asset = await convert(SAMPLE_MODELS_BASE_URL + 'AnimatedMorphCube/AnimatedMorphCube.dae') + await validate(asset, { + info: { + hasAnimations: true, + hasMorphTargets: true, + primitivesCount: 1 + }, issues: { + numErrors: 0, + numInfos: 0, + numWarnings: 0 + } + }) + }) + + it('Box', async () => { + const asset = await convert(SAMPLE_MODELS_BASE_URL + 'Box/Box.dae') + await validate(asset, { + info: { + primitivesCount: 1 + }, issues: { + numErrors: 0, + numInfos: 0, + numWarnings: 0 + } + }) + }) + + it('BoxAnimated', async () => { + const asset = await convert(SAMPLE_MODELS_BASE_URL + 'BoxAnimated/BoxAnimated.dae') + await validate(asset, { + info: { + hasAnimations: true, + primitivesCount: 2 + }, issues: { + numErrors: 0, + numInfos: 0, + numWarnings: 0 + } + }) + }) + + it('BoxTextured', async () => { + const asset = await convert(SAMPLE_MODELS_BASE_URL + 'BoxTextured/BoxTextured.dae') + await validate(asset, { + info: { + hasTextures: true, + primitivesCount: 1, + resources: [{ + uri: 'CesiumLogoFlat.png' + }] + }, issues: { + numErrors: 0, + numInfos: 0, + numWarnings: 0 + } + }) + }) + + it('BrainStem', async () => { + const asset = await convert(SAMPLE_MODELS_BASE_URL + 'BrainStem/BrainStem.dae') + await validate(asset, { + info: { + hasAnimations: true, + hasSkins: true, + primitivesCount: 59 + }, issues: { + numErrors: 0, + numInfos: 0, + numWarnings: 0 + } + }) + }).timeout(10000) + + it('Buggy', async () => { + const asset = await convert(SAMPLE_MODELS_BASE_URL + 'Buggy/Buggy.dae') + await validate(asset, { + info: { + primitivesCount: 148 + }, issues: { + numErrors: 0, + /** + * Buggy has degenerate triangles which generates infos. + * Once we optimize them out, this should be uncommented. + */ + //numInfos: 0, + numWarnings: 0 + } + }) + }).timeout(10000) + + it('CesiumMan', async () => { + const asset = await convert(SAMPLE_MODELS_BASE_URL + 'CesiumMan/CesiumMan.dae') + await validate(asset, { + info: { + hasAnimations: true, + hasSkins: true, + hasTextures: true, + primitivesCount: 1, + resources: [{ + uri: 'CesiumMan.jpg' + }] + }, issues: { + numErrors: 0, + numInfos: 0, + numWarnings: 0 + } + }) + }) + + it('CesiumMilkTruck', async () => { + const asset = await convert(SAMPLE_MODELS_BASE_URL + 'CesiumMilkTruck/CesiumMilkTruck.dae') + await validate(asset, { + info: { + hasAnimations: true, + hasTextures: true, + primitivesCount: 4, + resources: [{ + uri: 'CesiumMilkTruck.png' + }] + }, issues: { + numErrors: 0, + numInfos: 0, + numWarnings: 0 + } + }) + }) + + it('Duck', async () => { + const asset = await convert(SAMPLE_MODELS_BASE_URL + 'Duck/Duck.dae') + await validate(asset, { + info: { + hasTextures: true, + primitivesCount: 1, + resources: [{ + uri: 'DuckCM.png' + }] + }, issues: { + numErrors: 0, + numInfos: 0, + numWarnings: 0 + } + }) + }) + + it('GearboxAssy', async () => { + const asset = await convert(SAMPLE_MODELS_BASE_URL + 'GearboxAssy/GearboxAssy.dae') + await validate(asset, { + info: { + primitivesCount: 42 + }, issues: { + numErrors: 0, + numInfos: 0, + numWarnings: 0 + } + }) + }).timeout(10000) + + it('Monster', async () => { + const asset = await convert(SAMPLE_MODELS_BASE_URL + 'Monster/Monster.dae') + await validate(asset, { + info: { + hasAnimations: true, + hasSkins: true, + hasTextures: true, + primitivesCount: 1, + resources: [{ + uri: 'Monster.jpg' + }] + }, issues: { + numErrors: 0, + numInfos: 0, + numWarnings: 0 + } + }) + }) + + it('ReciprocatingSaw', async () => { + const asset = await convert(SAMPLE_MODELS_BASE_URL + 'ReciprocatingSaw/ReciprocatingSaw.dae') + await validate(asset, { + info: { + primitivesCount: 65 + }, issues: { + numErrors: 0, + numInfos: 0, + numWarnings: 0 + } + }) + }).timeout(10000) + + it('RiggedFigure', async () => { + const asset = await convert(SAMPLE_MODELS_BASE_URL + 'RiggedFigure/RiggedFigure.dae') + await validate(asset, { + info: { + hasAnimations: true, + hasSkins: true, + primitivesCount: 1, + }, issues: { + numErrors: 0, + numInfos: 0, + numWarnings: 0 + } + }) + }) + + it('RiggedSimple', async () => { + const asset = await convert(SAMPLE_MODELS_BASE_URL + 'RiggedSimple/RiggedSimple.dae') + await validate(asset, { + info: { + hasAnimations: true, + hasSkins: true, + primitivesCount: 1, + }, issues: { + numErrors: 0, + numInfos: 0, + numWarnings: 0 + } + }) + }) + + it('VC', async () => { + const asset = await convert(SAMPLE_MODELS_BASE_URL + 'VC/VC.dae') + await validate(asset, { + info: { + hasAnimations: true, + hasTextures: true, + primitivesCount: 167, + resources: [{ + uri: '001.jpg' + }, { + uri: 'cockpit-map.jpg' + }, { + uri: 's_08.jpg' + }, { + uri: 's_06.jpg' + }, { + uri: 's_04.jpg' + }, { + uri: 's_02.jpg' + }, { + uri: 's_07.jpg' + }, { + uri: 's_03.jpg' + }, { + uri: 's_05.jpg' + }, { + uri: 's_01.jpg' + }, { + uri: '002.jpg' + }, { + uri: '11.jpg' + },, { + uri: 'machine.jpg' + }, { + uri: 'prop128.png' + }, { + uri: 'scrapsurf03-red.jpg' + }, { + uri: 'f22.jpg' + }, { + uri: 'heli.jpg' + }, { + uri: 'O21.jpg' + }, { + uri: '5.jpg' + }, { + uri: 'surface01.jpg' + }] + }, issues: { + numErrors: 0, + numInfos: 0, + numWarnings: 0 + } + }) + }) + + it('WalkingLady', async () => { + const asset = await convert(SAMPLE_MODELS_BASE_URL + 'WalkingLady/WalkingLady.dae') + await validate(asset, { + info: { + hasAnimations: true, + hasSkins: true, + primitivesCount: 1 + }, issues: { + numErrors: 0, + numInfos: 0, + numWarnings: 0 + } + }) + }) +}) \ No newline at end of file