diff --git a/src/LoaderBundle/Exception/Loader/LoadingRebrickableFailedException.php b/src/LoaderBundle/Exception/Loader/LoadingRebrickableFailedException.php new file mode 100644 index 0000000..e62965c --- /dev/null +++ b/src/LoaderBundle/Exception/Loader/LoadingRebrickableFailedException.php @@ -0,0 +1,7 @@ +output->writeln('Loading file from: '.$url.''); + $this->writeOutput(['Loading file from: '.$url.'']); $temp = tempnam(sys_get_temp_dir(), 'printabrick.'); $ctx = stream_context_create([], [ 'notification' => [$this, 'progressCallback'], ]); - try { - if (false === file_put_contents($temp, fopen($url, 'r', 0, $ctx))) { - throw new WriteErrorException($temp); - } - } catch (\ErrorException $e) { - throw new FileNotFoundException($url); - } catch (\Exception $e) { - throw new LogicException($e); + if (false === file_put_contents($temp, fopen($url, 'r', 0, $ctx))) { + throw new WriteErrorException($temp); } return $temp; diff --git a/src/LoaderBundle/Service/ImageLoader.php b/src/LoaderBundle/Service/ImageLoader.php index 4572d0d..42804e5 100644 --- a/src/LoaderBundle/Service/ImageLoader.php +++ b/src/LoaderBundle/Service/ImageLoader.php @@ -5,6 +5,7 @@ namespace LoaderBundle\Service; use AppBundle\Entity\LDraw\Model; use Doctrine\ORM\EntityManagerInterface; use League\Flysystem\FilesystemInterface; +use LoaderBundle\Exception\FileException; use LoaderBundle\Service\Stl\StlRendererService; use Psr\Log\LoggerInterface; @@ -32,6 +33,8 @@ class ImageLoader extends BaseLoader * Download ZIP file with part images from rebrickable and unzip file to filesystem. * * @param int $color color id used by rebrickable + * + * @throws FileException */ public function loadColorFromRebrickable($color) { @@ -41,14 +44,15 @@ class ImageLoader extends BaseLoader $zip = new \ZipArchive($file); if ($zip->open($file) === true) { - $this->output->writeln([ + $this->writeOutput([ "Extracting ZIP file into {$this->mediaFilesystem->getAdapter()->getPathPrefix()}images/{$color}", ]); $zip->extractTo($this->mediaFilesystem->getAdapter()->getPathPrefix().'images'.DIRECTORY_SEPARATOR.$color); $zip->close(); - $this->output->writeln(['Done!']); + $this->writeOutput(['Done!']); } else { $this->logger->error('Extraction of file failed!'); + throw new FileException($file); } } @@ -69,7 +73,7 @@ class ImageLoader extends BaseLoader unset($models); // Render images - $this->output->writeln([ + $this->writeOutput([ 'Rendering missing images of models', ]); $this->initProgressBar(count($missing)); @@ -79,7 +83,7 @@ class ImageLoader extends BaseLoader try { $this->loadModelImage($this->mediaFilesystem->getAdapter()->getPathPrefix().$model->getPath()); } catch (\Exception $e) { - $this->logger->error('Error rendering model '.$model->getId().' image', $e); + $this->logger->error('Error rendering model '.$model->getId().' image'); } $this->progressBar->advance(); } diff --git a/src/LoaderBundle/Service/ModelLoader.php b/src/LoaderBundle/Service/ModelLoader.php index 9555e25..55ac9b1 100644 --- a/src/LoaderBundle/Service/ModelLoader.php +++ b/src/LoaderBundle/Service/ModelLoader.php @@ -102,27 +102,29 @@ class ModelLoader extends BaseLoader '------------------------------------------------------------------------------', ]); - $libraryZip = $this->downloadFile($url); + try { + $libraryZip = $this->downloadFile($url); - $temp_dir = tempnam(sys_get_temp_dir(), 'printabrick.'); - if (file_exists($temp_dir)) { - unlink($temp_dir); - } - mkdir($temp_dir); + $temp_dir = tempnam(sys_get_temp_dir(), 'printabrick.'); + if (file_exists($temp_dir)) { + unlink($temp_dir); + } + mkdir($temp_dir); - $zip = new \ZipArchive(); - if ($zip->open($libraryZip) != 'true') { - echo 'Error :- Unable to open the Zip File'; - } - $zip->extractTo($temp_dir); - $zip->close(); - unlink($libraryZip); + $zip = new \ZipArchive(); + $zip->open($libraryZip); + $zip->extractTo($temp_dir); + $zip->close(); + unlink($libraryZip); - $this->writeOutput(['LDraw libary downloaded']); + $this->writeOutput(['LDraw libary downloaded']); - // return ldraw directory if in zip file - if (file_exists($temp_dir.'/ldraw/')) { - return $temp_dir.'/ldraw/'; + // return ldraw directory if in zip file + if (file_exists($temp_dir.'/ldraw/')) { + return $temp_dir.'/ldraw/'; + } + } catch (\Exception $exception) { + throw new \LogicException('Falied to open Zip archive'); } return $temp_dir; diff --git a/src/LoaderBundle/Service/RebrickableLoader.php b/src/LoaderBundle/Service/RebrickableLoader.php index 973aaf9..e8a2983 100644 --- a/src/LoaderBundle/Service/RebrickableLoader.php +++ b/src/LoaderBundle/Service/RebrickableLoader.php @@ -6,6 +6,7 @@ use AppBundle\Entity\Rebrickable\Part; use AppBundle\Entity\Rebrickable\Set; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Query\Expr\Join; +use LoaderBundle\Exception\Loader\LoadingRebrickableFailedException; use Psr\Log\LoggerInterface; //TODO Refactor + validate csv files @@ -30,9 +31,9 @@ class RebrickableLoader extends BaseLoader } /** - * Truncates and loads all rebrickable tables from csv files + * Truncates and loads all rebrickable tables from csv files. * - * @throws \Exception + * @throws LoadingRebrickableFailedException */ public function loadAll() { @@ -67,19 +68,19 @@ class RebrickableLoader extends BaseLoader $this->writeOutput(['Rebrickable database loaded successfully!']); } catch (\Exception $e) { - $this->writeOutput(['Rollback back']); - $connection->rollBack(); - throw $e; + // $this->writeOutput(['Rollback back']); +// $connection->rollBack(); + + throw new LoadingRebrickableFailedException(); } } - /** - * Downloads csv files from rebrickable_url specified in config.yml + * Downloads csv files from rebrickable_url specified in config.yml. */ private function loadCSVFiles() { - $array = ['inventories', 'inventory_parts', 'inventory_sets', 'sets', 'themes', 'parts', 'part_categories', 'colors']; + $array = ['inventories', 'inventory_parts', 'inventory_sets', 'sets', 'themes', 'parts', 'part_categories']; $this->writeOutput([ '------------------------------------------------------------------------------', @@ -133,6 +134,9 @@ class RebrickableLoader extends BaseLoader return $this->em->getConnection()->prepare($query)->execute(); } + /** + * Creates missing Part entites for foreign keys form inventory_parts table. + */ private function addMissingParts() { $connection = $this->em->getConnection(); @@ -185,8 +189,8 @@ class RebrickableLoader extends BaseLoader return $this->loadCsvFile($csv, 'rebrickable_category', '(`id`,`name`)'); } - private function loadColorTable($csv) - { - return $this->loadCsvFile($csv, 'color', '(`id`,`name`,`rgb`, @var) SET transparent = IF(@var=\'t\',1,0)'); - } +// private function loadColorTable($csv) +// { +// return $this->loadCsvFile($csv, 'color', '(`id`,`name`,`rgb`, @var) SET transparent = IF(@var=\'t\',1,0)'); +// } } diff --git a/src/LoaderBundle/Service/Stl/StlConverterService.php b/src/LoaderBundle/Service/Stl/StlConverterService.php index f9c5dcb..4c6d498 100644 --- a/src/LoaderBundle/Service/Stl/StlConverterService.php +++ b/src/LoaderBundle/Service/Stl/StlConverterService.php @@ -93,65 +93,9 @@ class StlConverterService return $this->mediaFilesystem->get($newFile); } - } else { - return $this->mediaFilesystem->get($newFile); } - throw new ConvertingFailedException($file, 'STL'); - } - - /** - * Convert LDraw model from .dat format to .stl by using LDView - * stores created file to $stlStorage filesystem. - * - * @param string $file - * @param bool $rewrite - * - * @throws ConvertingFailedException - * - * @return File - */ - public function datToPng($file, $rewrite = false) - { - if (!$this->ldrawLibraryContext) { - throw new LDLibraryMissingException(); - } - - if (!$this->mediaFilesystem->has('images')) { - $this->mediaFilesystem->createDir('images'); - } - - $newFile = 'images'.DIRECTORY_SEPARATOR.basename($file, '.dat').'.png'; - - if (!$this->mediaFilesystem->has($newFile) || $rewrite) { - $this->runLDView([ - $file, - '-LDrawDir='.$this->ldrawLibraryContext->getAdapter()->getPathPrefix(), - '-AutoCrop=0', - '-SaveAlpha=0', - '-BackgroundColor3=0xFFFFFF', - '-DefaultColor3=0x136FC3', - '-SnapshotSuffix=.png', - '-HiResPrimitives=1', - '-UseQualityStuds=1', - '-UseQualityLighting=1', - '-SaveHeight=600', - '-SaveWidth=800', - '-CurveQuality=12', - '-DefaultLatLong=45,40', - '-SaveDir='.$this->mediaFilesystem->getAdapter()->getPathPrefix().'images', - '-SaveSnapshots=1', - ]); - - // Check if file created successfully - if ($this->mediaFilesystem->has($newFile)) { - return $this->mediaFilesystem->get($newFile); - } - } else { - return $this->mediaFilesystem->get($newFile); - } - - throw new ConvertingFailedException($file, 'PNG'); + return $this->mediaFilesystem->get($newFile); } /** diff --git a/src/LoaderBundle/Service/Stl/StlRendererService.php b/src/LoaderBundle/Service/Stl/StlRendererService.php index fbe54fd..8bd2ce5 100644 --- a/src/LoaderBundle/Service/Stl/StlRendererService.php +++ b/src/LoaderBundle/Service/Stl/StlRendererService.php @@ -5,6 +5,7 @@ namespace LoaderBundle\Service\Stl; use LoaderBundle\Exception\ConvertingFailedException; use LoaderBundle\Exception\FileNotFoundException; use LoaderBundle\Exception\RenderFailedException; +use Symfony\Component\Process\Exception\ProcessFailedException; use Symfony\Component\Process\Process; use Symfony\Component\Process\ProcessBuilder; @@ -101,9 +102,6 @@ class StlRendererService if (!file_exists($file)) { throw new FileNotFoundException($file); } - if (pathinfo($file, PATHINFO_EXTENSION) != 'stl') { - throw new ConvertingFailedException($file, 'POV', 'Wrong input filetype'); - } // Save the current working directory and change directory to tmp dir // stl2pov outputs converted file to current directory and destination can not be changed @@ -195,7 +193,8 @@ class StlRendererService //+AMn - use non-adaptive (n=1) or adaptive (n=2) supersampling //+A0.n - perform antialiasing (if color change is above n percent) //-D - Turns graphic display off - $process = $processBuilder->setPrefix($this->povray) + $process = $processBuilder + ->setPrefix($this->povray) ->setArguments([ "+I\"{$file}\"", '+FN', @@ -207,8 +206,13 @@ class StlRendererService '+A0.5', '-D', ])->getProcess(); + $process->mustRun(); + if (!$process->isSuccessful()) { + throw new ProcessFailedException($process); + } + if (!file_exists($outputFile)) { throw new RenderFailedException("{$to}{$filename}.png"); } diff --git a/src/LoaderBundle/Util/RelationMapper.php b/src/LoaderBundle/Util/RelationMapper.php index 6a19a2b..76eb5b3 100644 --- a/src/LoaderBundle/Util/RelationMapper.php +++ b/src/LoaderBundle/Util/RelationMapper.php @@ -3,10 +3,10 @@ namespace LoaderBundle\Util; use Doctrine\Common\Cache\CacheProvider; +use LoaderBundle\Exception\RelationMapper\InvalidDomainException; use LoaderBundle\Exception\RelationMapper\InvalidResourceException; use LoaderBundle\Exception\RelationMapper\ResourceNotFoundException; use Symfony\Component\OptionsResolver\Exception\InvalidArgumentException; -use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; use Symfony\Component\Yaml\Exception\ParseException; use Symfony\Component\Yaml\Yaml; @@ -69,6 +69,6 @@ class RelationMapper if (isset($this->relations[$domain])) { return isset($this->relations[$domain][$number]) ? $this->relations[$domain][$number] : $number; } - throw new InvalidOptionsException(); + throw new InvalidDomainException(); } } diff --git a/tests/LoaderBundle/Service/ImageLoader/ImageLoaderTest.php b/tests/LoaderBundle/Service/ImageLoader/ImageLoaderTest.php new file mode 100644 index 0000000..58542e0 --- /dev/null +++ b/tests/LoaderBundle/Service/ImageLoader/ImageLoaderTest.php @@ -0,0 +1,62 @@ +setUpDb([LoadBaseData::class]); + + $file = $this->createMock(File::class); + $file->method('getPath')->willReturn('path'); + + $stlRenderer = $this->createMock(StlRendererService::class); + $stlRenderer->method('render')->willReturn('image'); + + $this->imageLoader = new ImageLoader($this->em, $this->get('monolog.logger.event'), $this->filesystem, __DIR__.'/fixtures/', $stlRenderer); + $this->imageLoader->setOutput(new NullOutput()); + } + + public function testLoadFromRebrickable() + { + $this->imageLoader->loadColorFromRebrickable(-1); + + $this->assertCount(8, $this->filesystem->listContents('images/-1/')); + } + + /** + * @expectedException \LoaderBundle\Exception\FileException + */ + public function testLoadCorrupted() + { + $this->imageLoader->loadColorFromRebrickable(5); + } + + public function testLoadMissingImages() + { + $stlRenderer = $this->createMock(StlRendererService::class); + $stlRenderer->method('render')->willReturn('image'); + + $stlRenderer->expects($this->exactly(3))->method('render'); + + $this->imageLoader = new ImageLoader($this->em, $this->get('monolog.logger.event'), $this->filesystem, __DIR__.'/fixtures/', $stlRenderer); + $this->imageLoader->setOutput(new NullOutput()); + + $this->imageLoader->loadMissingModelImages(); + } +} diff --git a/tests/LoaderBundle/Service/ImageLoader/fixtures/ldraw/parts_-1.zip b/tests/LoaderBundle/Service/ImageLoader/fixtures/ldraw/parts_-1.zip new file mode 100644 index 0000000..70d55da Binary files /dev/null and b/tests/LoaderBundle/Service/ImageLoader/fixtures/ldraw/parts_-1.zip differ diff --git a/tests/LoaderBundle/Service/ImageLoader/fixtures/ldraw/parts_5.zip b/tests/LoaderBundle/Service/ImageLoader/fixtures/ldraw/parts_5.zip new file mode 100644 index 0000000..3c232e0 Binary files /dev/null and b/tests/LoaderBundle/Service/ImageLoader/fixtures/ldraw/parts_5.zip differ diff --git a/tests/LoaderBundle/Service/ModelLoader/ModelLoaderTest.php b/tests/LoaderBundle/Service/ModelLoader/ModelLoaderTest.php index f7b6709..041561a 100644 --- a/tests/LoaderBundle/Service/ModelLoader/ModelLoaderTest.php +++ b/tests/LoaderBundle/Service/ModelLoader/ModelLoaderTest.php @@ -1,16 +1,16 @@ method('find') ->will($this->returnArgument(0)); - $this->modelLoader = new ModelLoader($this->get('doctrine.orm.entity_manager'),$this->get('monolog.logger.event'),$stlConverter,$relationMapper,null); + $this->modelLoader = new ModelLoader($this->em, $this->get('monolog.logger.event'), $stlConverter, $relationMapper); $this->modelLoader->setOutput(new NullOutput()); - $this->setUpDb(); + $this->setUpDb([LoadColors::class]); } public function testLoadOne() { - $this->modelLoader->setLDrawLibraryContext(__DIR__ . '/fixtures/librarycontext/'); - $this->modelLoader->loadOne(__DIR__ . '/fixtures/librarycontext/parts/3820.dat'); + $this->modelLoader->setLDrawLibraryContext(__DIR__.'/fixtures/librarycontext/'); + $this->modelLoader->loadOne(__DIR__.'/fixtures/librarycontext/parts/3820.dat'); /** @var Model[] $models */ $models = $this->modelRepository->findAll(); @@ -67,33 +67,33 @@ class ModelLoaderTest extends BaseTest public function testFileContext() { - $this->modelLoader->setLDrawLibraryContext(__DIR__ . '/fixtures/librarycontext/'); - $this->modelLoader->loadOne(__DIR__ . '/fixtures/filecontext/parts/999.dat'); + $this->modelLoader->setLDrawLibraryContext(__DIR__.'/fixtures/librarycontext/'); + $this->modelLoader->loadOne(__DIR__.'/fixtures/filecontext/parts/999.dat'); /** @var Model[] $models */ $models = $this->modelRepository->findAll(); $this->assertEquals(1, count($models)); $this->assertEquals(3820, $models[0]->getId()); - $this->assertEquals(2,count($models[0]->getAliases())); + $this->assertEquals(2, count($models[0]->getAliases())); } public function testLoadAlias() { - $this->modelLoader->setLDrawLibraryContext(__DIR__ . '/fixtures/librarycontext/'); - $this->modelLoader->loadOne(__DIR__ . '/fixtures/filecontext/parts/999.dat'); + $this->modelLoader->setLDrawLibraryContext(__DIR__.'/fixtures/librarycontext/'); + $this->modelLoader->loadOne(__DIR__.'/fixtures/filecontext/parts/999.dat'); /** @var Model[] $models */ $models = $this->modelRepository->findAll(); $this->assertEquals(1, count($models)); $this->assertEquals(3820, $models[0]->getId()); - $this->assertEquals(2,count($models[0]->getAliases())); + $this->assertEquals(2, count($models[0]->getAliases())); } public function testLicense() { - $this->modelLoader->setLDrawLibraryContext(__DIR__ . '/fixtures/license/'); + $this->modelLoader->setLDrawLibraryContext(__DIR__.'/fixtures/license/'); $this->modelLoader->loadAll(); $models = $this->modelRepository->findAll(); @@ -104,7 +104,7 @@ class ModelLoaderTest extends BaseTest public function testIsIncluded() { - $this->modelLoader->setLDrawLibraryContext(__DIR__ . '/fixtures/included/'); + $this->modelLoader->setLDrawLibraryContext(__DIR__.'/fixtures/included/'); $this->modelLoader->loadAll(); $models = $this->modelRepository->findAll(); @@ -113,7 +113,7 @@ class ModelLoaderTest extends BaseTest public function testLoadAll() { - $this->modelLoader->setLDrawLibraryContext(__DIR__ . '/fixtures/librarycontext/'); + $this->modelLoader->setLDrawLibraryContext(__DIR__.'/fixtures/librarycontext/'); $this->modelLoader->loadAll(); $models = $this->modelRepository->findAll(); @@ -124,17 +124,17 @@ class ModelLoaderTest extends BaseTest public function testUpdate() { // Load original model - $this->modelLoader->setLDrawLibraryContext(__DIR__ . '/fixtures/update/version1/'); + $this->modelLoader->setLDrawLibraryContext(__DIR__.'/fixtures/update/version1/'); $this->modelLoader->loadAll(); $this->assertEquals(1, count($this->modelRepository->findAll())); $model = $this->modelRepository->findOneByNumber('983'); $this->assertInstanceOf(Model::class, $model); - $this->assertEquals('3820',$model->getId()); + $this->assertEquals('3820', $model->getId()); $this->assertEquals(2, count($model->getAliases())); // Load new version - $this->modelLoader->setLDrawLibraryContext(__DIR__ . '/fixtures/update/version2/'); + $this->modelLoader->setLDrawLibraryContext(__DIR__.'/fixtures/update/version2/'); $this->modelLoader->setRewrite(true); $this->modelLoader->loadAll(); @@ -151,31 +151,49 @@ class ModelLoaderTest extends BaseTest public function testUpdate2() { // Load original model - $this->modelLoader->setLDrawLibraryContext(__DIR__ . '/fixtures/update2/version1/'); + $this->modelLoader->setLDrawLibraryContext(__DIR__.'/fixtures/update2/version1/'); $this->modelLoader->loadAll(); // Load new version - $this->modelLoader->setLDrawLibraryContext(__DIR__ . '/fixtures/update2/version2/'); + $this->modelLoader->setLDrawLibraryContext(__DIR__.'/fixtures/update2/version2/'); $this->modelLoader->setRewrite(false); $this->modelLoader->loadAll(); /** @var Model $model */ $model = $this->modelRepository->find('3820'); $this->assertEquals(1, count($this->modelRepository->findAll())); - $this->assertEquals(2009,$model->getModified()->format('Y')); + $this->assertEquals(2009, $model->getModified()->format('Y')); $this->modelLoader->setRewrite(true); $this->modelLoader->loadAll(); - $this->assertEquals(2010,$model->getModified()->format('Y')); + $this->assertEquals(2010, $model->getModified()->format('Y')); } - public function testLoadOfPrinted() { - $this->modelLoader->setLDrawLibraryContext(__DIR__ . '/fixtures/printed/'); - $this->modelLoader->loadOne(__DIR__ . '/fixtures/printed/parts/30367bps7.dat'); + public function testLoadOfPrinted() + { + $this->modelLoader->setLDrawLibraryContext(__DIR__.'/fixtures/printed/'); + $this->modelLoader->loadOne(__DIR__.'/fixtures/printed/parts/30367bps7.dat'); $models = $this->modelRepository->findAll(); $this->assertEquals(1, count($models)); $this->assertEquals('30367b', $models[0]->getId()); } -} \ No newline at end of file + + public function testDownload() + { + $library = $this->modelLoader->downloadLibrary(__DIR__.'/fixtures/ldraw.zip'); + + $this->assertDirectoryExists($library); + } + + /** + * @expectedException \LogicException + */ + public function testDownloadFailed() + { + $library = $this->modelLoader->downloadLibrary(__DIR__.'/fixtures/nofile.zip'); + + $this->assertDirectoryExists($library); + } +} diff --git a/tests/LoaderBundle/Service/ModelLoader/fixtures/ldraw.zip b/tests/LoaderBundle/Service/ModelLoader/fixtures/ldraw.zip new file mode 100644 index 0000000..639f549 Binary files /dev/null and b/tests/LoaderBundle/Service/ModelLoader/fixtures/ldraw.zip differ diff --git a/tests/LoaderBundle/Service/RebrickableLoader/RebrickableLoaderTest.php b/tests/LoaderBundle/Service/RebrickableLoader/RebrickableLoaderTest.php new file mode 100644 index 0000000..a692fee --- /dev/null +++ b/tests/LoaderBundle/Service/RebrickableLoader/RebrickableLoaderTest.php @@ -0,0 +1,45 @@ +setUpDb([LoadColors::class]); + + $this->rebrickableLoader = new RebrickableLoader($this->em, $this->get('monolog.logger.event'), __DIR__.'/fixtures/'); + } + + public function testLoadAll() + { + $this->assertCount(0, $this->em->getRepository(Set::class)->findAll()); + $this->rebrickableLoader->loadAll(); + + $this->assertCount(1, $this->em->getRepository(Set::class)->findAll()); + } + +// /** +// * @expectedException LoaderBundle\Exception\Loader\LoadingRebrickableFailedException +// */ +// public function testRollback() { +// $this->rebrickableLoader = new RebrickableLoader($this->em,$this->get('monolog.logger.event'),__DIR__.'/corrupt/'); +// +// $this->assertCount(0,$this->em->getRepository(Set::class)->findAll()); +// +// $this->rebrickableLoader->loadAll(); +// +// $this->assertCount(0,$this->em->getRepository(Set::class)->findAll()); +// } +} diff --git a/tests/LoaderBundle/Service/RebrickableLoader/corrupt/inventories.csv b/tests/LoaderBundle/Service/RebrickableLoader/corrupt/inventories.csv new file mode 100644 index 0000000..618f495 --- /dev/null +++ b/tests/LoaderBundle/Service/RebrickableLoader/corrupt/inventories.csv @@ -0,0 +1,2 @@ +id,version,set_num +4609,1,0013-1 \ No newline at end of file diff --git a/tests/LoaderBundle/Service/RebrickableLoader/corrupt/inventory_parts.csv b/tests/LoaderBundle/Service/RebrickableLoader/corrupt/inventory_parts.csv new file mode 100644 index 0000000..f22053e --- /dev/null +++ b/tests/LoaderBundle/Service/RebrickableLoader/corrupt/inventory_parts.csv @@ -0,0 +1,8 @@ +inventory_id,part_num,color_id,quantity,is_spare +4609,3626apr0001,14,2,f +4609,3838,15,2,f +4609,3842a,15,2,f +4609,3962a,0,2,f +4609,970c00,15,2,f +4609,973p90c05,15,2,f +4609,255,15,2,f \ No newline at end of file diff --git a/tests/LoaderBundle/Service/RebrickableLoader/corrupt/inventory_sets.csv b/tests/LoaderBundle/Service/RebrickableLoader/corrupt/inventory_sets.csv new file mode 100644 index 0000000..43cc546 --- /dev/null +++ b/tests/LoaderBundle/Service/RebrickableLoader/corrupt/inventory_sets.csv @@ -0,0 +1 @@ +inventory_id,set_num,quantity \ No newline at end of file diff --git a/tests/LoaderBundle/Service/RebrickableLoader/corrupt/part_categories.csv b/tests/LoaderBundle/Service/RebrickableLoader/corrupt/part_categories.csv new file mode 100644 index 0000000..0eef1a1 --- /dev/null +++ b/tests/LoaderBundle/Service/RebrickableLoader/corrupt/part_categories.csv @@ -0,0 +1,3 @@ +,id,name,dasd +,,13,Minifigs,, +27,Minifig Accessories \ No newline at end of file diff --git a/tests/LoaderBundle/Service/RebrickableLoader/corrupt/parts.csv b/tests/LoaderBundle/Service/RebrickableLoader/corrupt/parts.csv new file mode 100644 index 0000000..ce51003 --- /dev/null +++ b/tests/LoaderBundle/Service/RebrickableLoader/corrupt/parts.csv @@ -0,0 +1,7 @@ +part_num,name,part_cat_id +3626apr0001,Minifig Head Standard Grin Print [Solid Stud],13 +3838,Minifig Airtanks,27 +3842a,Minifig Helmet Classic with Thin Chin Guard and Visor Dimples,27 +3962a,Minifig Radio [Compact Handle],27 +970c00,Legs and Hips [Complete Assembly],13 +973p90c05,Torso Space Classic Moon Print / White Arms / White Hands,13 \ No newline at end of file diff --git a/tests/LoaderBundle/Service/RebrickableLoader/corrupt/sets.csv b/tests/LoaderBundle/Service/RebrickableLoader/corrupt/sets.csv new file mode 100644 index 0000000..4a00468 --- /dev/null +++ b/tests/LoaderBundle/Service/RebrickableLoader/corrupt/sets.csv @@ -0,0 +1,2 @@ +set_num,name,year,theme_id,num_parts +0013-1,Space Mini-Figures,1979,143,12 \ No newline at end of file diff --git a/tests/LoaderBundle/Service/RebrickableLoader/corrupt/themes.csv b/tests/LoaderBundle/Service/RebrickableLoader/corrupt/themes.csv new file mode 100644 index 0000000..edda4e2 --- /dev/null +++ b/tests/LoaderBundle/Service/RebrickableLoader/corrupt/themes.csv @@ -0,0 +1,3 @@ +id,name,parent_id +126,Space, +143,Supplemental,126 \ No newline at end of file diff --git a/tests/LoaderBundle/Service/RebrickableLoader/fixtures/inventories.csv b/tests/LoaderBundle/Service/RebrickableLoader/fixtures/inventories.csv new file mode 100644 index 0000000..618f495 --- /dev/null +++ b/tests/LoaderBundle/Service/RebrickableLoader/fixtures/inventories.csv @@ -0,0 +1,2 @@ +id,version,set_num +4609,1,0013-1 \ No newline at end of file diff --git a/tests/LoaderBundle/Service/RebrickableLoader/fixtures/inventory_parts.csv b/tests/LoaderBundle/Service/RebrickableLoader/fixtures/inventory_parts.csv new file mode 100644 index 0000000..f22053e --- /dev/null +++ b/tests/LoaderBundle/Service/RebrickableLoader/fixtures/inventory_parts.csv @@ -0,0 +1,8 @@ +inventory_id,part_num,color_id,quantity,is_spare +4609,3626apr0001,14,2,f +4609,3838,15,2,f +4609,3842a,15,2,f +4609,3962a,0,2,f +4609,970c00,15,2,f +4609,973p90c05,15,2,f +4609,255,15,2,f \ No newline at end of file diff --git a/tests/LoaderBundle/Service/RebrickableLoader/fixtures/inventory_sets.csv b/tests/LoaderBundle/Service/RebrickableLoader/fixtures/inventory_sets.csv new file mode 100644 index 0000000..43cc546 --- /dev/null +++ b/tests/LoaderBundle/Service/RebrickableLoader/fixtures/inventory_sets.csv @@ -0,0 +1 @@ +inventory_id,set_num,quantity \ No newline at end of file diff --git a/tests/LoaderBundle/Service/RebrickableLoader/fixtures/part_categories.csv b/tests/LoaderBundle/Service/RebrickableLoader/fixtures/part_categories.csv new file mode 100644 index 0000000..594ce51 --- /dev/null +++ b/tests/LoaderBundle/Service/RebrickableLoader/fixtures/part_categories.csv @@ -0,0 +1,3 @@ +id,name +13,Minifigs +27,Minifig Accessories \ No newline at end of file diff --git a/tests/LoaderBundle/Service/RebrickableLoader/fixtures/parts.csv b/tests/LoaderBundle/Service/RebrickableLoader/fixtures/parts.csv new file mode 100644 index 0000000..ce51003 --- /dev/null +++ b/tests/LoaderBundle/Service/RebrickableLoader/fixtures/parts.csv @@ -0,0 +1,7 @@ +part_num,name,part_cat_id +3626apr0001,Minifig Head Standard Grin Print [Solid Stud],13 +3838,Minifig Airtanks,27 +3842a,Minifig Helmet Classic with Thin Chin Guard and Visor Dimples,27 +3962a,Minifig Radio [Compact Handle],27 +970c00,Legs and Hips [Complete Assembly],13 +973p90c05,Torso Space Classic Moon Print / White Arms / White Hands,13 \ No newline at end of file diff --git a/tests/LoaderBundle/Service/RebrickableLoader/fixtures/sets.csv b/tests/LoaderBundle/Service/RebrickableLoader/fixtures/sets.csv new file mode 100644 index 0000000..4a00468 --- /dev/null +++ b/tests/LoaderBundle/Service/RebrickableLoader/fixtures/sets.csv @@ -0,0 +1,2 @@ +set_num,name,year,theme_id,num_parts +0013-1,Space Mini-Figures,1979,143,12 \ No newline at end of file diff --git a/tests/LoaderBundle/Service/RebrickableLoader/fixtures/themes.csv b/tests/LoaderBundle/Service/RebrickableLoader/fixtures/themes.csv new file mode 100644 index 0000000..edda4e2 --- /dev/null +++ b/tests/LoaderBundle/Service/RebrickableLoader/fixtures/themes.csv @@ -0,0 +1,3 @@ +id,name,parent_id +126,Space, +143,Supplemental,126 \ No newline at end of file diff --git a/tests/LoaderBundle/Service/RelationLoader/RelationLoaderTest.php b/tests/LoaderBundle/Service/RelationLoader/RelationLoaderTest.php new file mode 100644 index 0000000..0026dd6 --- /dev/null +++ b/tests/LoaderBundle/Service/RelationLoader/RelationLoaderTest.php @@ -0,0 +1,54 @@ +setUpDb([LoadUnmappedData::class]); + + $file = $this->createMock(File::class); + $file->method('getPath')->willReturn('path'); + + $relationMapper = $this->createMock(RelationMapper::class); + $relationMapper->method('find')->will($this->returnArgument(0)); + + $this->relationLoader = new RelationLoader($this->get('doctrine.orm.entity_manager'), $this->get('monolog.logger.event'), $relationMapper); + $this->relationLoader->setOutput(new NullOutput()); + } + + public function testLoadAll() + { + $this->relationLoader->loadAll(); + + $parts = $this->em->getRepository(Part::class)->findAll(); + foreach ($parts as $part) { + $this->assertNotNull($part->getModel()); + } + } + + public function testLoadNotPaired() + { + $this->relationLoader->loadNotPaired(); + + $parts = $this->em->getRepository(Part::class)->findAll(); + foreach ($parts as $part) { + $this->assertNotNull($part->getModel()); + } + } +} diff --git a/tests/LoaderBundle/Service/Stl/StlConverter/StlConverterTest.php b/tests/LoaderBundle/Service/Stl/StlConverter/StlConverterTest.php index 6a397d9..83f7065 100644 --- a/tests/LoaderBundle/Service/Stl/StlConverter/StlConverterTest.php +++ b/tests/LoaderBundle/Service/Stl/StlConverter/StlConverterTest.php @@ -2,10 +2,10 @@ namespace Tests\AppBundle\Service\Stl; -use LoaderBundle\Service\Stl\StlConverterService; -use LoaderBundle\Service\Stl\StlFixerService; use League\Flysystem\Adapter\Local; use League\Flysystem\Filesystem; +use LoaderBundle\Service\Stl\StlConverterService; +use LoaderBundle\Service\Stl\StlFixerService; use Tests\AppBundle\BaseTest; class StlConverterTest extends BaseTest @@ -13,7 +13,6 @@ class StlConverterTest extends BaseTest /** @var StlConverterService */ private $stlConverter; - public function setUp() { parent::setUp(); @@ -23,40 +22,70 @@ class StlConverterTest extends BaseTest $stlFixer = $this->createMock(StlFixerService::class); $stlFixer->method('fix'); - $this->stlConverter = new StlConverterService($ldview,$this->filesystem,$stlFixer); + $this->stlConverter = new StlConverterService($ldview, $this->filesystem, $stlFixer); } public function testConvertToStl() { - $adapter = new Local(__DIR__ . '/fixtures/ldraw'); + $adapter = new Local(__DIR__.'/fixtures/ldraw'); $ldrawLibraryContext = new Filesystem($adapter); $this->stlConverter->setLDrawLibraryContext($ldrawLibraryContext); - $this->assertNotNull($this->stlConverter->datToStl(__DIR__ . '/fixtures/ldraw/parts/983.dat')); + $this->assertNotNull($this->stlConverter->datToStl(__DIR__.'/fixtures/ldraw/parts/983.dat')); $this->assertTrue($this->filesystem->has('models/983.stl')); + } - $this->filesystem->delete('models/983.stl'); + public function testRewriteTrue() + { + $adapter = new Local(__DIR__.'/fixtures/ldraw'); + $ldrawLibraryContext = new Filesystem($adapter); + $this->stlConverter->setLDrawLibraryContext($ldrawLibraryContext); + + $this->filesystem->write('models/983.stl', file_get_contents(__DIR__.'/fixtures/983.stl')); + $this->assertTrue($this->filesystem->has('models/983.stl')); + + $this->stlConverter->datToStl(__DIR__.'/fixtures/ldraw/parts/983.dat', true); + + $this->assertEquals(file_get_contents(__DIR__.'/fixtures/expected.stl'), $this->filesystem->read('models/983.stl')); + } + + public function testRewriteFalse() + { + $adapter = new Local(__DIR__.'/fixtures/ldraw'); + $ldrawLibraryContext = new Filesystem($adapter); + $this->stlConverter->setLDrawLibraryContext($ldrawLibraryContext); + + $this->filesystem->write('models/983.stl', file_get_contents(__DIR__.'/fixtures/983.stl')); + $this->assertTrue($this->filesystem->has('models/983.stl')); + + $this->stlConverter->datToStl(__DIR__.'/fixtures/ldraw/parts/983.dat'); + + $this->assertEquals(file_get_contents(__DIR__.'/fixtures/983.stl'), $this->filesystem->read('models/983.stl')); } /** - * @expectedException LoaderBundle\Exception\Stl\LDLibraryMissingException + * @expectedException \LoaderBundle\Exception\Stl\LDLibraryMissingException */ public function testLDContextMissing() { - $this->stlConverter->datToStl(__DIR__ . '/fixtures/ldraw/parts/983.dat'); + $this->stlConverter->datToStl(__DIR__.'/fixtures/ldraw/parts/983.dat'); } - public function testConvertToPng() + /** + * @expectedException \Symfony\Component\Process\Exception\ProcessFailedException + */ + public function testProcessFailedException() { - $adapter = new Local(__DIR__ . '/fixtures/ldraw'); + $stlFixer = $this->createMock(StlFixerService::class); + $stlFixer->method('fix'); + + $this->stlConverter = new StlConverterService('', $this->filesystem, $stlFixer); + + $adapter = new Local(__DIR__.'/fixtures/ldraw'); $ldrawLibraryContext = new Filesystem($adapter); $this->stlConverter->setLDrawLibraryContext($ldrawLibraryContext); - $this->assertNotNull($this->stlConverter->datToPng(__DIR__ . '/fixtures/ldraw/parts/983.dat')); - - $this->assertTrue($this->filesystem->has('images/983.png')); - - $this->filesystem->delete('images/983.png'); + $this->stlConverter->datToStl(__DIR__.'/fixtures/ldraw/parts/983.dat'); } -} \ No newline at end of file +} diff --git a/tests/LoaderBundle/Service/Stl/StlConverter/fixtures/983.stl b/tests/LoaderBundle/Service/Stl/StlConverter/fixtures/983.stl new file mode 100644 index 0000000..c4c21f5 Binary files /dev/null and b/tests/LoaderBundle/Service/Stl/StlConverter/fixtures/983.stl differ diff --git a/tests/LoaderBundle/Service/Stl/StlConverter/fixtures/expected.stl b/tests/LoaderBundle/Service/Stl/StlConverter/fixtures/expected.stl new file mode 100644 index 0000000..922980b --- /dev/null +++ b/tests/LoaderBundle/Service/Stl/StlConverter/fixtures/expected.stl @@ -0,0 +1,1262 @@ +solid MYSOLID created by LDView, original data in 983.dat + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.240000 0.180092 -0.340716 + vertex 0.240000 -0.284620 -0.460896 + vertex 0.221720 -0.261624 -0.549812 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.221720 -0.261624 -0.549812 + vertex -0.240000 -0.284620 -0.460896 + vertex -0.240000 0.180092 -0.340716 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.160000 -0.284620 -0.460896 + vertex 0.160000 0.180092 -0.340716 + vertex 0.147840 -0.269288 -0.520188 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.147840 -0.269288 -0.520188 + vertex -0.160000 0.180092 -0.340716 + vertex -0.160000 -0.284620 -0.460896 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.194440 0.174556 -0.479232 + vertex -0.169720 0.154544 -0.522628 + vertex -0.169720 -0.242124 -0.625212 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.169720 -0.242124 -0.625212 + vertex 0.169720 0.154544 -0.522628 + vertex 0.194440 0.174556 -0.479232 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.113120 -0.256296 -0.570416 + vertex -0.113120 0.180976 -0.457328 + vertex -0.130200 0.185988 -0.429672 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.130200 0.185988 -0.429672 + vertex 0.113120 0.180976 -0.457328 + vertex 0.113120 -0.256296 -0.570416 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.080000 0.087024 -0.596236 + vertex 0.080000 0.114932 -0.572988 + vertex 0.091840 0.092164 -0.592468 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.091840 0.092164 -0.592468 + vertex 0.080000 0.114932 -0.572988 + vertex 0.108480 0.111892 -0.575924 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.080000 0.138908 -0.545880 + vertex 0.108480 0.111892 -0.575924 + vertex 0.080000 0.114932 -0.572988 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.108480 0.111892 -0.575924 + vertex 0.080000 0.138908 -0.545880 + vertex 0.127480 0.128728 -0.558432 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.080000 0.158600 -0.515464 + vertex 0.127480 0.128728 -0.558432 + vertex 0.080000 0.138908 -0.545880 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.127480 0.128728 -0.558432 + vertex 0.080000 0.158600 -0.515464 + vertex 0.148120 0.142892 -0.540512 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.113120 0.180976 -0.457328 + vertex 0.148120 0.142892 -0.540512 + vertex 0.080000 0.158600 -0.515464 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.113120 0.180976 -0.457328 + vertex 0.080000 0.158600 -0.515464 + vertex 0.080000 0.173532 -0.482144 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.148120 0.142892 -0.540512 + vertex 0.113120 0.180976 -0.457328 + vertex 0.169720 0.154544 -0.522628 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.130200 0.185988 -0.429672 + vertex 0.169720 0.154544 -0.522628 + vertex 0.113120 0.180976 -0.457328 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.169720 0.154544 -0.522628 + vertex 0.130200 0.185988 -0.429672 + vertex 0.194440 0.174556 -0.479232 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.147840 0.187736 -0.401992 + vertex 0.194440 0.174556 -0.479232 + vertex 0.130200 0.185988 -0.429672 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.194440 0.174556 -0.479232 + vertex 0.147840 0.187736 -0.401992 + vertex 0.221720 0.185400 -0.434204 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.153880 0.185888 -0.371092 + vertex 0.221720 0.185400 -0.434204 + vertex 0.147840 0.187736 -0.401992 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.221720 0.185400 -0.434204 + vertex 0.153880 0.185888 -0.371092 + vertex 0.230680 0.187352 -0.387176 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.230680 0.187352 -0.387176 + vertex 0.153880 0.185888 -0.371092 + vertex 0.200000 0.180092 -0.340716 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.160000 0.180092 -0.340716 + vertex 0.200000 0.180092 -0.340716 + vertex 0.153880 0.185888 -0.371092 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.230680 0.187352 -0.387176 + vertex 0.200000 0.180092 -0.340716 + vertex 0.240000 0.180092 -0.340716 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.148120 0.142892 -0.540512 + vertex -0.080000 0.158600 -0.515464 + vertex -0.127480 0.128728 -0.558432 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.127480 0.128728 -0.558432 + vertex -0.080000 0.138908 -0.545880 + vertex -0.108480 0.111892 -0.575924 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.108480 0.111892 -0.575924 + vertex -0.080000 0.114932 -0.572988 + vertex -0.091840 0.092164 -0.592468 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.113120 0.180976 -0.457328 + vertex -0.080000 0.158600 -0.515464 + vertex -0.148120 0.142892 -0.540512 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.113120 0.180976 -0.457328 + vertex -0.169720 0.154544 -0.522628 + vertex -0.130200 0.185988 -0.429672 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.169720 0.154544 -0.522628 + vertex -0.113120 0.180976 -0.457328 + vertex -0.148120 0.142892 -0.540512 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.194440 0.174556 -0.479232 + vertex -0.130200 0.185988 -0.429672 + vertex -0.169720 0.154544 -0.522628 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.130200 0.185988 -0.429672 + vertex -0.194440 0.174556 -0.479232 + vertex -0.147840 0.187736 -0.401992 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.221720 0.185400 -0.434204 + vertex -0.147840 0.187736 -0.401992 + vertex -0.194440 0.174556 -0.479232 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.147840 0.187736 -0.401992 + vertex -0.221720 0.185400 -0.434204 + vertex -0.153880 0.185888 -0.371092 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.153880 0.185888 -0.371092 + vertex -0.200000 0.180092 -0.340716 + vertex -0.160000 0.180092 -0.340716 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.200000 0.180092 -0.340716 + vertex -0.153880 0.185888 -0.371092 + vertex -0.230680 0.187352 -0.387176 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.230680 0.187352 -0.387176 + vertex -0.153880 0.185888 -0.371092 + vertex -0.221720 0.185400 -0.434204 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.240000 0.180092 -0.340716 + vertex -0.200000 0.180092 -0.340716 + vertex -0.230680 0.187352 -0.387176 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.080000 -0.228516 -0.677840 + vertex -0.080000 -0.250748 -0.591868 + vertex -0.091840 -0.229104 -0.675556 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.091840 -0.229104 -0.675556 + vertex 0.080000 -0.250748 -0.591868 + vertex 0.080000 -0.228516 -0.677840 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.091840 0.092164 -0.592468 + vertex -0.080000 0.114932 -0.572988 + vertex -0.080000 0.087024 -0.596236 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.080000 0.114932 -0.572988 + vertex -0.108480 0.111892 -0.575924 + vertex -0.080000 0.138908 -0.545880 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.080000 0.138908 -0.545880 + vertex -0.127480 0.128728 -0.558432 + vertex -0.080000 0.158600 -0.515464 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.080000 0.173532 -0.482144 + vertex -0.080000 0.158600 -0.515464 + vertex -0.113120 0.180976 -0.457328 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.084852 -0.084852 0.000000 + vertex 0.062184 -0.100000 0.000000 + vertex 0.084852 -0.084852 -0.058564 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.106408 -0.052596 -0.181912 + vertex 0.110868 -0.045924 -0.183268 + vertex 0.084852 -0.084852 -0.058564 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.084852 -0.084852 -0.058564 + vertex -0.062184 -0.100000 0.000000 + vertex -0.084852 -0.084852 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.084852 -0.084852 -0.058564 + vertex -0.110868 -0.045924 -0.183268 + vertex -0.106408 -0.052596 -0.181912 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.000000 -0.100000 0.000000 + vertex -0.038268 -0.092392 0.000000 + vertex -0.062184 -0.100000 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.062184 -0.100000 0.000000 + vertex 0.038268 -0.092392 0.000000 + vertex 0.000000 -0.100000 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.084852 -0.084852 -0.058564 + vertex -0.106408 -0.052596 -0.181912 + vertex -0.091848 -0.055048 -0.172496 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.091848 -0.055048 -0.172496 + vertex 0.106408 -0.052596 -0.181912 + vertex 0.084852 -0.084852 -0.058564 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.230680 0.187352 -0.387176 + vertex 0.240000 0.180092 -0.340716 + vertex 0.221720 -0.261624 -0.549812 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.230680 0.187352 -0.387176 + vertex 0.221720 -0.261624 -0.549812 + vertex 0.221720 0.185400 -0.434204 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.221720 -0.261624 -0.549812 + vertex -0.240000 0.180092 -0.340716 + vertex -0.230680 0.187352 -0.387176 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.221720 -0.261624 -0.549812 + vertex -0.230680 0.187352 -0.387176 + vertex -0.221720 0.185400 -0.434204 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.153880 0.185888 -0.371092 + vertex 0.147840 0.187736 -0.401992 + vertex 0.147840 -0.269288 -0.520188 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.153880 0.185888 -0.371092 + vertex 0.147840 -0.269288 -0.520188 + vertex 0.160000 0.180092 -0.340716 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.147840 -0.269288 -0.520188 + vertex -0.147840 0.187736 -0.401992 + vertex -0.153880 0.185888 -0.371092 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.147840 -0.269288 -0.520188 + vertex -0.153880 0.185888 -0.371092 + vertex -0.160000 0.180092 -0.340716 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.221720 0.185400 -0.434204 + vertex -0.194440 0.174556 -0.479232 + vertex -0.169720 -0.242124 -0.625212 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.221720 0.185400 -0.434204 + vertex -0.169720 -0.242124 -0.625212 + vertex -0.221720 -0.261624 -0.549812 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.169720 -0.242124 -0.625212 + vertex 0.194440 0.174556 -0.479232 + vertex 0.221720 0.185400 -0.434204 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.169720 -0.242124 -0.625212 + vertex 0.221720 0.185400 -0.434204 + vertex 0.221720 -0.261624 -0.549812 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.130200 0.185988 -0.429672 + vertex -0.147840 0.187736 -0.401992 + vertex -0.147840 -0.269288 -0.520188 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.130200 0.185988 -0.429672 + vertex -0.147840 -0.269288 -0.520188 + vertex -0.113120 -0.256296 -0.570416 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.147840 -0.269288 -0.520188 + vertex 0.147840 0.187736 -0.401992 + vertex 0.130200 0.185988 -0.429672 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.147840 -0.269288 -0.520188 + vertex 0.130200 0.185988 -0.429672 + vertex 0.113120 -0.256296 -0.570416 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.080000 0.173532 -0.482144 + vertex 0.080000 -0.250748 -0.591868 + vertex 0.113120 -0.256296 -0.570416 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.080000 0.173532 -0.482144 + vertex 0.113120 -0.256296 -0.570416 + vertex 0.113120 0.180976 -0.457328 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.113120 -0.256296 -0.570416 + vertex -0.080000 -0.250748 -0.591868 + vertex -0.080000 0.173532 -0.482144 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.113120 -0.256296 -0.570416 + vertex -0.080000 0.173532 -0.482144 + vertex -0.113120 0.180976 -0.457328 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.108480 0.111892 -0.575924 + vertex -0.091840 0.092164 -0.592468 + vertex -0.091840 -0.229104 -0.675556 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.108480 0.111892 -0.575924 + vertex -0.091840 -0.229104 -0.675556 + vertex -0.108480 -0.231880 -0.664828 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.091840 -0.229104 -0.675556 + vertex 0.091840 0.092164 -0.592468 + vertex 0.108480 0.111892 -0.575924 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.091840 -0.229104 -0.675556 + vertex 0.108480 0.111892 -0.575924 + vertex 0.108480 -0.231880 -0.664828 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.127480 0.128728 -0.558432 + vertex -0.108480 0.111892 -0.575924 + vertex -0.108480 -0.231880 -0.664828 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.127480 0.128728 -0.558432 + vertex -0.108480 -0.231880 -0.664828 + vertex -0.127480 -0.235064 -0.652512 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.108480 -0.231880 -0.664828 + vertex 0.108480 0.111892 -0.575924 + vertex 0.127480 0.128728 -0.558432 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.108480 -0.231880 -0.664828 + vertex 0.127480 0.128728 -0.558432 + vertex 0.127480 -0.235064 -0.652512 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.148120 0.142892 -0.540512 + vertex -0.127480 0.128728 -0.558432 + vertex -0.127480 -0.235064 -0.652512 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.148120 0.142892 -0.540512 + vertex -0.127480 -0.235064 -0.652512 + vertex -0.148120 -0.238520 -0.639152 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.127480 -0.235064 -0.652512 + vertex 0.127480 0.128728 -0.558432 + vertex 0.148120 0.142892 -0.540512 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.127480 -0.235064 -0.652512 + vertex 0.148120 0.142892 -0.540512 + vertex 0.148120 -0.238520 -0.639152 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.169720 -0.242124 -0.625212 + vertex -0.169720 0.154544 -0.522628 + vertex -0.148120 0.142892 -0.540512 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.169720 -0.242124 -0.625212 + vertex -0.148120 0.142892 -0.540512 + vertex -0.148120 -0.238520 -0.639152 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.148120 0.142892 -0.540512 + vertex 0.169720 0.154544 -0.522628 + vertex 0.169720 -0.242124 -0.625212 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.148120 0.142892 -0.540512 + vertex 0.169720 -0.242124 -0.625212 + vertex 0.148120 -0.238520 -0.639152 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.091840 -0.229104 -0.675556 + vertex -0.091840 0.092164 -0.592468 + vertex -0.080000 0.087024 -0.596236 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.091840 -0.229104 -0.675556 + vertex -0.080000 0.087024 -0.596236 + vertex -0.080000 -0.228516 -0.677840 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.091840 -0.229104 -0.675556 + vertex 0.080000 -0.228516 -0.677840 + vertex 0.080000 0.087024 -0.596236 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.091840 -0.229104 -0.675556 + vertex 0.080000 0.087024 -0.596236 + vertex 0.091840 0.092164 -0.592468 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.113136 -0.256292 -0.570432 + vertex -0.147824 -0.269288 -0.520176 + vertex -0.221732 -0.261624 -0.549812 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.113136 -0.256292 -0.570432 + vertex -0.221732 -0.261624 -0.549812 + vertex -0.169704 -0.242128 -0.625196 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.147824 -0.269288 -0.520176 + vertex -0.160000 -0.284620 -0.460896 + vertex -0.239996 -0.284620 -0.460896 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.147824 -0.269288 -0.520176 + vertex -0.239996 -0.284620 -0.460896 + vertex -0.221732 -0.261624 -0.549812 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.160000 -0.284620 -0.460896 + vertex 0.147824 -0.269288 -0.520176 + vertex 0.221732 -0.261624 -0.549812 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.160000 -0.284620 -0.460896 + vertex 0.221732 -0.261624 -0.549812 + vertex 0.239996 -0.284620 -0.460896 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.147824 -0.269288 -0.520176 + vertex 0.113136 -0.256292 -0.570432 + vertex 0.169704 -0.242128 -0.625196 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.147824 -0.269288 -0.520176 + vertex 0.169704 -0.242128 -0.625196 + vertex 0.221732 -0.261624 -0.549812 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.169720 -0.242124 -0.625212 + vertex -0.091840 -0.229104 -0.675556 + vertex -0.080000 -0.250748 -0.591868 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.169720 -0.242124 -0.625212 + vertex -0.080000 -0.250748 -0.591868 + vertex -0.113120 -0.256296 -0.570416 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.080000 -0.250748 -0.591868 + vertex 0.091840 -0.229104 -0.675556 + vertex 0.169720 -0.242124 -0.625212 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.080000 -0.250748 -0.591868 + vertex 0.169720 -0.242124 -0.625212 + vertex 0.113120 -0.256296 -0.570416 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.080000 0.064792 -0.510264 + vertex -0.080000 -0.250748 -0.591868 + vertex -0.080000 -0.228516 -0.677840 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.080000 0.064792 -0.510264 + vertex -0.080000 -0.228516 -0.677840 + vertex -0.080000 0.087024 -0.596236 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.080000 -0.228516 -0.677840 + vertex 0.080000 -0.250748 -0.591868 + vertex 0.080000 0.064792 -0.510264 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.080000 -0.228516 -0.677840 + vertex 0.080000 0.064792 -0.510264 + vertex 0.080000 0.087024 -0.596236 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.080000 0.087024 -0.596236 + vertex -0.080000 0.114932 -0.572988 + vertex -0.080000 0.138908 -0.545880 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.080000 0.087024 -0.596236 + vertex -0.080000 0.138908 -0.545880 + vertex -0.080000 0.064792 -0.510264 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.080000 0.173532 -0.482144 + vertex -0.080000 0.064792 -0.510264 + vertex -0.080000 0.138908 -0.545880 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.080000 0.173532 -0.482144 + vertex -0.080000 0.138908 -0.545880 + vertex -0.080000 0.158600 -0.515464 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.080000 0.138908 -0.545880 + vertex 0.080000 0.114932 -0.572988 + vertex 0.080000 0.087024 -0.596236 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.080000 0.138908 -0.545880 + vertex 0.080000 0.087024 -0.596236 + vertex 0.080000 0.064792 -0.510264 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.080000 0.138908 -0.545880 + vertex 0.080000 0.064792 -0.510264 + vertex 0.080000 0.173532 -0.482144 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.080000 0.138908 -0.545880 + vertex 0.080000 0.173532 -0.482144 + vertex 0.080000 0.158600 -0.515464 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.110868 -0.045924 -0.183268 + vertex 0.110868 -0.045924 0.000000 + vertex 0.084852 -0.084852 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.110868 -0.045924 -0.183268 + vertex 0.084852 -0.084852 0.000000 + vertex 0.084852 -0.084852 -0.058564 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.120000 0.000000 -0.177692 + vertex 0.120000 0.000000 0.000000 + vertex 0.110868 -0.045924 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.120000 0.000000 -0.177692 + vertex 0.110868 -0.045924 0.000000 + vertex 0.110868 -0.045924 -0.183268 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.110868 0.045924 -0.159508 + vertex 0.110868 0.045924 0.000000 + vertex 0.120000 0.000000 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.110868 0.045924 -0.159508 + vertex 0.120000 0.000000 0.000000 + vertex 0.120000 0.000000 -0.177692 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.091848 0.074384 -0.139024 + vertex 0.091848 0.074384 0.000000 + vertex 0.110868 0.045924 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.091848 0.074384 -0.139024 + vertex 0.110868 0.045924 0.000000 + vertex 0.110868 0.045924 -0.159508 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.084852 0.084852 0.000000 + vertex 0.091848 0.074384 0.000000 + vertex 0.091848 0.074384 -0.139024 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.084852 0.084852 0.000000 + vertex 0.091848 0.074384 -0.139024 + vertex 0.084852 0.084852 -0.139980 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.045924 0.110868 -0.120156 + vertex 0.045924 0.110868 0.000000 + vertex 0.084852 0.084852 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.045924 0.110868 -0.120156 + vertex 0.084852 0.084852 0.000000 + vertex 0.084852 0.084852 -0.139980 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.000000 0.120000 -0.108376 + vertex 0.000000 0.120000 0.000000 + vertex 0.045924 0.110868 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.000000 0.120000 -0.108376 + vertex 0.045924 0.110868 0.000000 + vertex 0.045924 0.110868 -0.120156 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.084852 -0.084852 0.000000 + vertex -0.110868 -0.045924 0.000000 + vertex -0.110868 -0.045924 -0.183268 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.084852 -0.084852 0.000000 + vertex -0.110868 -0.045924 -0.183268 + vertex -0.084852 -0.084852 -0.058564 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.110868 -0.045924 0.000000 + vertex -0.120000 0.000000 0.000000 + vertex -0.120000 0.000000 -0.177692 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.110868 -0.045924 0.000000 + vertex -0.120000 0.000000 -0.177692 + vertex -0.110868 -0.045924 -0.183268 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.120000 0.000000 0.000000 + vertex -0.110868 0.045924 0.000000 + vertex -0.110868 0.045924 -0.159508 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.120000 0.000000 0.000000 + vertex -0.110868 0.045924 -0.159508 + vertex -0.120000 0.000000 -0.177692 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.110868 0.045924 0.000000 + vertex -0.091848 0.074384 0.000000 + vertex -0.091848 0.074384 -0.139024 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.110868 0.045924 0.000000 + vertex -0.091848 0.074384 -0.139024 + vertex -0.110868 0.045924 -0.159508 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.091848 0.074384 -0.139024 + vertex -0.091848 0.074384 0.000000 + vertex -0.084852 0.084852 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.091848 0.074384 -0.139024 + vertex -0.084852 0.084852 0.000000 + vertex -0.084852 0.084852 -0.139980 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.084852 0.084852 0.000000 + vertex -0.045924 0.110868 0.000000 + vertex -0.045924 0.110868 -0.120156 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.084852 0.084852 0.000000 + vertex -0.045924 0.110868 -0.120156 + vertex -0.084852 0.084852 -0.139980 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.045924 0.110868 0.000000 + vertex 0.000000 0.120000 0.000000 + vertex 0.000000 0.120000 -0.108376 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.045924 0.110868 0.000000 + vertex 0.000000 0.120000 -0.108376 + vertex -0.045924 0.110868 -0.120156 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.100000 0.000000 0.000000 + vertex 0.092392 -0.038268 0.000000 + vertex 0.110868 -0.045920 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.100000 0.000000 0.000000 + vertex 0.110868 -0.045920 0.000000 + vertex 0.120000 0.000000 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.092392 -0.038268 0.000000 + vertex 0.070712 -0.070712 0.000000 + vertex 0.084852 -0.084852 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.092392 -0.038268 0.000000 + vertex 0.084852 -0.084852 0.000000 + vertex 0.110868 -0.045920 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.070712 -0.070712 0.000000 + vertex 0.038268 -0.092392 0.000000 + vertex 0.062184 -0.100000 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.070712 -0.070712 0.000000 + vertex 0.062184 -0.100000 0.000000 + vertex 0.084852 -0.084852 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.038268 -0.092392 0.000000 + vertex -0.070712 -0.070712 0.000000 + vertex -0.084852 -0.084852 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.038268 -0.092392 0.000000 + vertex -0.084852 -0.084852 0.000000 + vertex -0.062184 -0.100000 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.070712 -0.070712 0.000000 + vertex -0.092392 -0.038268 0.000000 + vertex -0.110868 -0.045920 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.070712 -0.070712 0.000000 + vertex -0.110868 -0.045920 0.000000 + vertex -0.084852 -0.084852 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.092392 -0.038268 0.000000 + vertex -0.100000 0.000000 0.000000 + vertex -0.120000 0.000000 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.092392 -0.038268 0.000000 + vertex -0.120000 0.000000 0.000000 + vertex -0.110868 -0.045920 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.100000 0.000000 0.000000 + vertex -0.092392 0.038268 0.000000 + vertex -0.110868 0.045920 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.100000 0.000000 0.000000 + vertex -0.110868 0.045920 0.000000 + vertex -0.120000 0.000000 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.092392 0.038268 0.000000 + vertex -0.070712 0.070708 0.000000 + vertex -0.084852 0.084852 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.092392 0.038268 0.000000 + vertex -0.084852 0.084852 0.000000 + vertex -0.110868 0.045920 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.070712 0.070708 0.000000 + vertex -0.038268 0.092392 0.000000 + vertex -0.045920 0.110868 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.070712 0.070708 0.000000 + vertex -0.045920 0.110868 0.000000 + vertex -0.084852 0.084852 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.038268 0.092392 0.000000 + vertex 0.000000 0.100000 0.000000 + vertex 0.000000 0.120000 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.038268 0.092392 0.000000 + vertex 0.000000 0.120000 0.000000 + vertex -0.045920 0.110868 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.000000 0.100000 0.000000 + vertex 0.038268 0.092392 0.000000 + vertex 0.045920 0.110868 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.000000 0.100000 0.000000 + vertex 0.045920 0.110868 0.000000 + vertex 0.000000 0.120000 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.038268 0.092392 0.000000 + vertex 0.070712 0.070708 0.000000 + vertex 0.084852 0.084852 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.038268 0.092392 0.000000 + vertex 0.084852 0.084852 0.000000 + vertex 0.045920 0.110868 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.070712 0.070708 0.000000 + vertex 0.092392 0.038268 0.000000 + vertex 0.110868 0.045920 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.070712 0.070708 0.000000 + vertex 0.110868 0.045920 0.000000 + vertex 0.084852 0.084852 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.092392 0.038268 0.000000 + vertex 0.100000 0.000000 0.000000 + vertex 0.120000 0.000000 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.092392 0.038268 0.000000 + vertex 0.120000 0.000000 0.000000 + vertex 0.110868 0.045920 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.062184 -0.100000 0.000000 + vertex -0.084852 -0.084852 -0.058564 + vertex 0.084852 -0.084852 -0.058564 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex -0.062184 -0.100000 0.000000 + vertex 0.084852 -0.084852 -0.058564 + vertex 0.062184 -0.100000 0.000000 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.000000 -0.084852 -0.058564 + vertex -0.084852 -0.084852 -0.058564 + vertex -0.091848 -0.055048 -0.172496 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.000000 -0.084852 -0.058564 + vertex -0.091848 -0.055048 -0.172496 + vertex 0.000000 -0.059656 -0.154824 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.091848 -0.055048 -0.172496 + vertex 0.084852 -0.084852 -0.058564 + vertex 0.000000 -0.084852 -0.058564 + endloop + endfacet + facet normal 0.000000 0.000000 0.000000 + outer loop + vertex 0.091848 -0.055048 -0.172496 + vertex 0.000000 -0.084852 -0.058564 + vertex 0.000000 -0.059656 -0.154824 + endloop + endfacet +endsolid MYSOLID diff --git a/tests/LoaderBundle/Service/Stl/StlFixer/StlFixerTest.php b/tests/LoaderBundle/Service/Stl/StlFixer/StlFixerTest.php index d088828..d0a9a6e 100644 --- a/tests/LoaderBundle/Service/Stl/StlFixer/StlFixerTest.php +++ b/tests/LoaderBundle/Service/Stl/StlFixer/StlFixerTest.php @@ -2,12 +2,7 @@ namespace Tests\AppBundle\Service\Stl; -use LoaderBundle\Service\Stl\StlConverterService; use LoaderBundle\Service\Stl\StlFixerService; -use League\Flysystem\Adapter\Local; -use League\Flysystem\Filesystem; -use League\Flysystem\FilesystemInterface; -use PHPUnit\Framework\TestCase; use Tests\AppBundle\BaseTest; class StlFixer extends BaseTest @@ -22,18 +17,30 @@ class StlFixer extends BaseTest parent::setUp(); $this->stlFixer = new StlFixerService($this->getParameter('admesh_bin')); - $this->input = __DIR__ . '/fixtures/ascii.stl'; - } - - public function tearDown() - { - $this->filesystem->delete('output.stl'); + $this->input = __DIR__.'/fixtures/ascii.stl'; } public function testFixing() { - $this->stlFixer->fix($this->input,$this->filesystem->getAdapter()->getPathPrefix().'/output.stl'); + $this->stlFixer->fix($this->input, $this->filesystem->getAdapter()->getPathPrefix().'/output.stl'); $this->assertTrue($this->filesystem->has('output.stl')); } -} \ No newline at end of file + + /** + * @expectedException \LoaderBundle\Exception\FileNotFoundException + */ + public function testFileNotFound() + { + $this->stlFixer->fix('', ''); + } + + /** + * @expectedException \Symfony\Component\Process\Exception\ProcessFailedException + */ + public function testCorruptProcess() + { + $this->stlFixer = new StlFixerService(''); + $this->stlFixer->fix($this->input); + } +} diff --git a/tests/LoaderBundle/Service/Stl/StlRenderer/StlRendererTest.php b/tests/LoaderBundle/Service/Stl/StlRenderer/StlRendererTest.php index 7b59046..8424009 100644 --- a/tests/LoaderBundle/Service/Stl/StlRenderer/StlRendererTest.php +++ b/tests/LoaderBundle/Service/Stl/StlRenderer/StlRendererTest.php @@ -2,13 +2,7 @@ namespace Tests\AppBundle\Service\Stl; -use LoaderBundle\Service\Stl\StlConverterService; -use LoaderBundle\Service\Stl\StlFixerService; use LoaderBundle\Service\Stl\StlRendererService; -use League\Flysystem\Adapter\Local; -use League\Flysystem\Filesystem; -use League\Flysystem\FilesystemInterface; -use PHPUnit\Framework\TestCase; use Tests\AppBundle\BaseTest; class StlRendererTest extends BaseTest @@ -20,21 +14,37 @@ class StlRendererTest extends BaseTest { parent::setUp(); - $layout = __DIR__ . '/fixtures/layout.tmpl'; + $layout = __DIR__.'/fixtures/layout.tmpl'; $povray = $this->getParameter('povray_bin'); $stl2pov = $this->getParameter('stl2pov_bin'); - $this->stlRenderer = new StlRendererService($layout,$povray,$stl2pov); - } - - public function tearDown() - { - $this->filesystem->delete('973c00.png'); + $this->stlRenderer = new StlRendererService($layout, $povray, $stl2pov); } public function testRendering() { - $this->stlRenderer->render(__DIR__ . '/fixtures/973c00.stl',$this->filesystem->getAdapter()->getPathPrefix()); + $this->stlRenderer->render(__DIR__.'/fixtures/973c00.stl', $this->filesystem->getAdapter()->getPathPrefix()); $this->assertTrue($this->filesystem->has('973c00.png')); } -} \ No newline at end of file + + /** + * @expectedException \LoaderBundle\Exception\FileNotFoundException + */ + public function testFileNotFound() + { + $this->stlRenderer->render('abc', $this->filesystem->getAdapter()->getPathPrefix()); + } + + /** + * @expectedException \Symfony\Component\Process\Exception\ProcessFailedException + */ + public function testPovRayMissing() + { + $layout = __DIR__.'/fixtures/layout.tmpl'; + $stl2pov = $this->getParameter('stl2pov_bin'); + $this->stlRenderer = new StlRendererService($layout, '', $stl2pov); + + $this->stlRenderer->render(__DIR__.'/fixtures/973c00.stl', $this->filesystem->getAdapter()->getPathPrefix()); + $this->assertTrue($this->filesystem->has('973c00.png')); + } +} diff --git a/tests/LoaderBundle/Util/LDModelParser/LDModelParserTest.php b/tests/LoaderBundle/Util/LDModelParser/LDModelParserTest.php index 911b367..e454cae 100644 --- a/tests/LoaderBundle/Util/LDModelParser/LDModelParserTest.php +++ b/tests/LoaderBundle/Util/LDModelParser/LDModelParserTest.php @@ -2,11 +2,8 @@ namespace Tests\LoaderBundle\Util\LDModelParser; -use AppBundle\Exception\ErrorParsingLineException; -use AppBundle\Exception\ParseErrorException; use LoaderBundle\Util\LDModelParser; use PHPUnit\Framework\TestCase; -use Symfony\Component\Validator\Constraints\DateTime; class LDModelParserTest extends TestCase { @@ -22,56 +19,63 @@ class LDModelParserTest extends TestCase public function testValid() { - $resource = file_get_contents(__DIR__ . '/fixtures/valid.dat'); + $resource = file_get_contents(__DIR__.'/fixtures/valid.dat'); $array = [ - "id" => "1234", - "name" => "Category Name", - "category" => "Category!", - "keywords" => [ - 'keyword1', 'keyword 2', 'keyword3', 'keyword4' + 'id' => '1234', + 'name' => 'Category Name', + 'category' => 'Category!', + 'keywords' => [ + 'keyword1', 'keyword 2', 'keyword3', 'keyword4', ], - "author" => "Author [nickname]", - "modified" => new \DateTime('2017-04-01'), - "type" => "Part", + 'author' => 'Author [nickname]', + 'modified' => new \DateTime('2017-04-01'), + 'type' => 'Part', 'subparts' => [ 'submodel' => [ 1 => 2, - 16 => 1 - ] + 16 => 1, + ], ], - "parent" => null, - "license" => "Redistributable under CCAL version 2.0", + 'parent' => null, + 'license' => 'Redistributable under CCAL version 2.0', ]; $this->assertEquals($array, $this->parser->parse($resource)); } - /** - * @expectedException LoaderBundle\Exception\ErrorParsingLineException + * @expectedException \LoaderBundle\Exception\ErrorParsingLineException */ public function testInvalid() { - $resource = file_get_contents(__DIR__ . '/fixtures/invalid.dat'); + $resource = file_get_contents(__DIR__.'/fixtures/invalid.dat'); $this->parser->parse($resource); } - public function testStickers() { - $resource = file_get_contents(__DIR__ . '/fixtures/stickers.txt'); + public function testStickers() + { + $resource = file_get_contents(__DIR__.'/fixtures/stickers.txt'); foreach (preg_split('/^---DAT/m', $resource) as $dat) { $this->assertEquals('Sticker', $this->parser->parse($dat)['type']); } } + public function testColor() + { + $resource = file_get_contents(__DIR__.'/fixtures/color.dat'); + + $this->assertEquals('3705', $this->parser->parse($resource)['parent']); + } + public function testAlias() { - $resource = file_get_contents(__DIR__ . '/fixtures/alias.txt'); + $resource = file_get_contents(__DIR__.'/fixtures/alias.txt'); foreach (preg_split('/^---DAT/m', $resource) as $dat) { $this->assertEquals('parent', $this->parser->parse($dat)['parent']); } } -} \ No newline at end of file +} diff --git a/tests/LoaderBundle/Util/LDModelParser/fixtures/color.dat b/tests/LoaderBundle/Util/LDModelParser/fixtures/color.dat new file mode 100644 index 0000000..4d863d5 --- /dev/null +++ b/tests/LoaderBundle/Util/LDModelParser/fixtures/color.dat @@ -0,0 +1,12 @@ +0 _Technic Axle 4 Black +0 Name: 370526.dat +0 Author: Michael Heidemann [mikeheide] +0 !LDRAW_ORG Part Physical_Colour UPDATE 2010-03 +0 !LICENSE Redistributable under CCAL version 2.0 : see CAreadme.txt + +0 BFC CERTIFY CCW + +0 !HISTORY 2010-12-31 [PTadmin] Official Update 2010-03 + +1 0 0 0 0 1 0 0 0 1 0 0 0 1 3705.DAT +0 diff --git a/tests/LoaderBundle/Util/RelationMapper/RelationMapperTest.php b/tests/LoaderBundle/Util/RelationMapper/RelationMapperTest.php index 5630c66..d92c71a 100644 --- a/tests/LoaderBundle/Util/RelationMapper/RelationMapperTest.php +++ b/tests/LoaderBundle/Util/RelationMapper/RelationMapperTest.php @@ -2,25 +2,23 @@ namespace Tests\LoaderBundle\Util\RelationMapper; -use LoaderBundle\Util\RelationMapper; use Doctrine\Common\Cache\ArrayCache; +use LoaderBundle\Util\RelationMapper; use PHPUnit\Framework\TestCase; -use Symfony\Component\Config\Resource\FileResource; -use Symfony\Component\Yaml\Yaml; class RelationMapperTest extends TestCase { public function testLoad() { $mapper = new RelationMapper(new ArrayCache()); - $mapper->loadResource(__DIR__ . '/fixtures/resources.yml', 'resources'); + $mapper->loadResource(__DIR__.'/fixtures/resources.yml', 'resources'); - $this->assertEquals('bar', $mapper->find('foo','resources')); - $this->assertEquals('bar', $mapper->find('bar','resources')); + $this->assertEquals('bar', $mapper->find('foo', 'resources')); + $this->assertEquals('bar', $mapper->find('bar', 'resources')); } /** - * @expectedException LoaderBundle\Exception\RelationMapper\ResourceNotFoundException + * @expectedException \LoaderBundle\Exception\RelationMapper\ResourceNotFoundException */ public function testLoadNonExistingResource() { @@ -30,12 +28,23 @@ class RelationMapperTest extends TestCase } /** - * @expectedException LoaderBundle\Exception\RelationMapper\InvalidResourceException + * @expectedException \LoaderBundle\Exception\RelationMapper\InvalidResourceException */ public function testLoadInvalidResource() { $mapper = new RelationMapper(new ArrayCache()); - $resource = __DIR__ . '/fixtures/invalid.yml'; + $resource = __DIR__.'/fixtures/invalid.yml'; $mapper->loadResource($resource, 'resources'); } -} \ No newline at end of file + + /** + * @expectedException \LoaderBundle\Exception\RelationMapper\InvalidDomainException + */ + public function testLoadInvalidDomain() + { + $mapper = new RelationMapper(new ArrayCache()); + $mapper->loadResource(__DIR__.'/fixtures/resources.yml', 'resources'); + + $mapper->find('foo', 'incorect'); + } +}