solstice

Compute collected power and efficiencies of a solar plant
git clone git://git.meso-star.com/solstice.git
Log | Files | Refs | README | LICENSE

test_ko_0.yaml (38957B)


      1 #
      2 # <spectrum> ::=
      3 #   spectrum:
      4 #     - <spectrum-data>
      5 # [   - <spectrum-data> ... ]
      6 #
      7 # <spectrum-data> ::=
      8 #  wavelength: REAL in [0, INF)
      9 #  data: REAL in [0, INF)
     10 #
     11 
     12 # missing spectrum definition
     13 - sun: { spectrum: }
     14 ---
     15 # missing wavelength
     16 - sun: { spectrum: [{data: 1}] }
     17 ---
     18 # missing data
     19 - sun: { spectrum: [{wavelength: 1}] }
     20 ---
     21 # 2x wavelength
     22 - sun: { spectrum: [{wavelength: 1, wavelength: 1}] }
     23 ---
     24 # 2x data
     25 - sun: { spectrum: [{data: 1, data: 1}] }
     26 ---
     27 # unknown dummy parameter
     28 - sun: { spectrum: [{dummy: 1}] }
     29 ---
     30 # missing wavelength value
     31 - sun: { spectrum: [{wavelength: , data: 1}] }
     32 ---
     33 # missing data value
     34 - sun: { spectrum: [{wavelength: 1, data: }] }
     35 ---
     36 # wavelength should be a number
     37 - sun: { spectrum: [{wavelength: "dummy", data: 1}] }
     38 ---
     39 # data should be a number
     40 - sun: { spectrum: [{wavelength: 1, data: "dummy"}] }
     41 ---
     42 # 0 invalid
     43 - sun: { spectrum: [{wavelength: 0, data: 1}] }
     44 ---
     45 # -1 invalid
     46 - sun: { spectrum: [{wavelength: -1, data: 1}] }
     47 ---
     48 # -1 invalid
     49 - sun: { spectrum: [{wavelength: 1, data: -1}] }
     50 ---
     51 # invalid non-increasing wavelengths
     52 - sun: { spectrum: [{wavelength: 1, data: 1}, {wavelength: 1, data: 2}] }
     53 ---
     54 
     55 #
     56 # dni: REAL # Direct Normal Irradiance in ]0, INF)
     57 #
     58 
     59 # missing dni value
     60 - sun: { dni: }
     61 ---
     62 # dni should be a number
     63 - sun: { dni: "dummy" }
     64 ---
     65 # 0 invalid
     66 - sun: { dni: 0 }
     67 ---
     68 # 2x dni
     69 - sun: { dni: 1, dni: 1 }
     70 ---
     71 
     72 #
     73 # <pillbox> ::=
     74 #   pillbox:
     75 #     half_angle: REAL # in ]0, 90]
     76 #
     77 
     78 # missing pillbox definition
     79 - sun: { pillbox: }
     80 ---
     81 # missing half_angle value
     82 - sun: { pillbox: { half_angle: } }
     83 ---
     84 # half_angle should be a number
     85 - sun: { pillbox: { half_angle: "dummy"} }
     86 ---
     87 # 0 invalid
     88 - sun: { pillbox: { half_angle: 0} }
     89 ---
     90 # 91 invalid
     91 - sun: { pillbox: { half_angle: 91} }
     92 ---
     93 # 2x half_angle
     94 - sun: { pillbox: { half_angle: 1, half_angle: 1} }
     95 ---
     96 # unknown dummy parameter
     97 - sun: { pillbox: { dummy: 1} }
     98 ---
     99 
    100 #
    101 # <gaussian> ::=
    102 #   gaussian:
    103 #     std_dev: REAL # in ]0, INF)
    104 #
    105 
    106 # missing gaussian definition
    107 - sun: { gaussian: }
    108 ---
    109 # missing std_dev value
    110 - sun: { gaussian: { std_dev: } }
    111 ---
    112 # std_dev should be a number
    113 - sun: { gaussian: { std_dev: "dummy"} }
    114 ---
    115 # 0 invalid
    116 - sun: { gaussian: { std_dev: 0} }
    117 ---
    118 # 2x std_dev
    119 - sun: { gaussian: { std_dev: 1, std_dev: 1} }
    120 ---
    121 # unknown dummy parameter
    122 - sun: { gaussian: { dummy: 1} }
    123 ---
    124 
    125 #
    126 # <buie> ::=
    127 #   buie:
    128 #     csr: REAL # in ]0, 1[
    129 #
    130 
    131 # missing buie definition
    132 - sun: { buie: }
    133 ---
    134 # missing csr value
    135 - sun: { buie: { csr: } }
    136 ---
    137 # csr should be a number
    138 - sun: { buie: { csr: "dummy"} }
    139 ---
    140 # 0 invalid
    141 - sun: { buie: { csr: 0} }
    142 ---
    143 # 1 invalid
    144 - sun: { buie: { csr: 1} }
    145 ---
    146 # 2x csr
    147 - sun: { buie: { csr: 0.5, csr: 0.5 } }
    148 ---
    149 # unknown dummy parameter
    150 - sun: { buie: { dummy: 1} }
    151 ---
    152 
    153 #
    154 # <sun> ::=
    155 #   sun:
    156 #     dni: REAL # Direct Normal Irradiance in ]0, INF)
    157 #     <spectrum>
    158 # [   <radial-angular-distribution> ]
    159 #
    160 # <radial-angular-distribution> ::=
    161 #    <pillbox> | <gaussian> | <buie>
    162 #
    163 
    164 # missing dni
    165 - sun: { spectrum: [{wavelength: 1, data: 1}] }
    166 ---
    167 # unknown dummy parameter
    168 - sun: { dummy: 1 }
    169 ---
    170 # 2x dni
    171 - sun: { dni: 1, dni: 1 }
    172 ---
    173 # 2x spectrum
    174 - sun:
    175     spectrum: [{wavelength: 1, data: 1}]
    176     spectrum: [{wavelength: 1, data: 1}]
    177 ---
    178 # 2x radial-angular-distribution
    179 - sun:
    180     pillbox: { half_angle: 1}
    181     buie: { csr: 0.5}
    182 ---
    183 
    184 #
    185 # <mirror> ::=
    186 #   mirror:
    187 #     reflectivity: REAL # in [0, 1]
    188 #     slope_error: REAL # in [0, 1]
    189 #   [ microfacet: <BECKMANN|PILLBOX> ]
    190 #
    191 
    192 # missing mirror definition
    193 - material: { mirror: }
    194 ---
    195 # unknown dummy attribute
    196 - material: { mirror: { dummy: 0 } }
    197 ---
    198 # missing reflectivity parameter
    199 - material: { mirror: { slope_error: 0 } }
    200 ---
    201 # missing slope_error parameter
    202 - material: { mirror: { reflectivity: 1 } }
    203 ---
    204 # slope_error should be a number
    205 - material: { mirror: { slope_error: "dummy" } }
    206 ---
    207 # reflectivity should be a number
    208 - material: { mirror: { reflectivity: "dummy" } }
    209 ---
    210 # -1 invalid
    211 - material: { mirror: { reflectivity: -1, slope_error: 0 } }
    212 ---
    213 # 1.5 invalid
    214 - material: { mirror: { reflectivity: 1.5, slope_error: 0 } }
    215 ---
    216 # -1 invalid
    217 - material: { mirror: { reflectivity: 1, slope_error: -1 } }
    218 ---
    219 # 1.5 invalid
    220 - material: { mirror: { reflectivity: 1, slope_error: 1.5 } }
    221 ---
    222 # 2x reflectivity
    223 - material: { mirror: { reflectivity: 1, reflectivity: 1 } }
    224 ---
    225 # 2x slope_error
    226 - material: { mirror: { slope_error: 1, slope_error: 1 } }
    227 ---
    228 # unknown microfacet
    229 - material: { mirror: { slope_error: 1, reflectivity: 1, microfacet: BECKBOX }}
    230 ---
    231 # 2x microfacet
    232 - material:
    233     mirror: 
    234       slope_error: 1
    235       reflectivity: 1
    236       microfacet: BECKMANN
    237       microfacet: PILLBOX
    238 
    239 #
    240 # <matte> ::=
    241 #   matte:
    242 #     reflectivity: REAL # in [0, 1]
    243 # [   normal_map: { path: PATH } ]
    244 #
    245 
    246 # missing matte parameters
    247 - material: {  matte: }
    248 ---
    249 # unknown dummy attribute
    250 - material: { matte: { dummy: 0 } }
    251 ---
    252 # reflectivity should be a number
    253 - material: { matte: { reflectivity: "dummy" } }
    254 ---
    255 # -1 invalid
    256 - material: { matte: { reflectivity: -1 } }
    257 ---
    258 # 1.5 invalid
    259 - material: { matte: { reflectivity: 1.5 } }
    260 ---
    261 # 2x reflectivity
    262 - material: { matte: { reflectivity: 1, reflectivity: 1 } }
    263 ---
    264 # bad normal map
    265 - material:
    266     matte: { reflectivity: 1, normal_map: map }
    267 ---
    268 # bad normal map
    269 - material:
    270     matte: { reflectivity: 1, normal_map: { path: } }
    271 ---
    272 # Missing reflectivity
    273 - material:
    274     matte: { normal_map: { path: test } }
    275 ---
    276 # 2x normal map
    277 - material:
    278     matte:
    279       reflectivity: 1
    280       normal_map: { path: test }
    281       normal_map: { path: test2}
    282 #
    283 #
    284 # <thin-dielectric> ::=
    285 #   thin_dielectric:
    286 #     thickness: REAL # in [0, INF)
    287 #     medium_i: <dielectric-medium>
    288 #     medium_t: <dielectric-medium>
    289 #
    290 
    291 # invalid extinction
    292 - material:
    293     thin_dielectric:
    294       thickness: 0
    295       medium_i: &m { refractive_index: 1, extinction: -1 }
    296       medium_t: *m
    297 ---
    298 # invalid thickness
    299 - material:
    300     thin_dielectric:
    301       thickness: -0.01
    302       medium_i: &m { refractive_index: 1, extinction: 0 }
    303       medium_t: *m
    304 ---
    305 # invalid refractive index
    306 - material:
    307     thin_dielectric:
    308       thickness: 0
    309       medium_i: &m { refractive_index: 0, extinction: 0 }
    310       medium_t: *m
    311 ---
    312 # missing thickness
    313 - material:
    314     thin_dielectric:
    315       medium_i: &m { refractive_index: 1, extinction: 0 }
    316       medium_t: *m
    317 ---
    318 
    319 #
    320 # <dielectric> ::=
    321 #   dielectric:
    322 #    medium_i: <dielectric-medium>
    323 #    medium_t: <dielectric-medium>
    324 #
    325 
    326 # invalid refractive_index
    327 - material:
    328     dielectric:
    329       medium_i: &m { refractive_index: 0, extinction: 0 }
    330       medium_t: *m
    331 ---
    332 # invalid extinction
    333 - material:
    334     dielectric:
    335       medium_i: &m { refractive_index: 1, extinction: -1 }
    336       medium_t: *m
    337 ---
    338 # missing refractive_index
    339 - material:
    340     dielectric:
    341       medium_i: &m { extinction: 0 }
    342       medium_t: *m
    343 ---
    344 # missing extinction
    345 - material:
    346     dielectric:
    347       medium_i: &m { refractive_index: 1 }
    348       medium_t: *m
    349 ---
    350 # missing medium_i
    351 - material:
    352     dielectric:
    353       medium_t: { refractive_index: 1, extinction: 0 }
    354 ---
    355 # missing medium_t
    356 - material:
    357     dielectric:
    358       medium_i: { refractive_index: 1, extinction: 0 }
    359 ---
    360 
    361 #
    362 # front: <material-descriptor>
    363 #
    364 
    365 # missing front definition
    366 - material: {  front: }
    367 ---
    368 # dummy is not a material
    369 - material: {  front: "dummy" }
    370 ---
    371 
    372 #
    373 # back: <material-descriptor>
    374 #
    375 
    376 # missing back parameters
    377 - material: {  back: }
    378 ---
    379 # dummy is not a material
    380 - material: {  back: "dummy" }
    381 ---
    382 
    383 #
    384 # <material> ::=
    385 #   <material-descriptor> | <double-sided-material>
    386 #
    387 # <double-sided-material> ::=
    388 #   front: <material-descriptor>
    389 #   back: <material-descriptor>
    390 #
    391 
    392 # missing material definition
    393 - material:
    394 ---
    395 # unknown dummy parameter
    396 - material: { dummy: 123 }
    397 ---
    398 # missing back
    399 - material: { front: { matte: { reflectivity: 0.5 } } }
    400 ---
    401 # missing front
    402 - material: { back: { matte: { reflectivity: 0.5 } } }
    403 ---
    404 # 2x front
    405 - material:
    406     front: &mat { matte: { reflectivity: 0.5 } }
    407     front: *mat
    408 ---
    409 # 2x back
    410 - material:
    411     back: &mat { matte: { reflectivity: 0.5 } }
    412     back: *mat
    413 ---
    414 # 2x description
    415 - material:
    416     front: &mat { matte: { reflectivity: 0.5 } }
    417     back: *mat
    418     matte: { reflectivity: 0.5 }
    419 ---
    420 # 2x description
    421 - material:
    422     matte: { reflectivity: 0.5 }
    423     front: &mat { matte: { reflectivity: 0.5 } }
    424     back: *mat
    425 ---
    426 
    427 # <polyclip-list> ::=
    428 #   - <polyclip>
    429 # [ - <polyclip> ... ]
    430 #
    431 # <polyclip> ::=
    432 #   operation: <AND|SUB>
    433 #   <contour-descriptor>
    434 #  
    435 # <contour-descriptor> ::=
    436 #    <vertices-descriptor>
    437 #  | <circle-descriptor>
    438 #  
    439 # <vertices-descriptor> ::=
    440 #  vertices: <vertices-list>
    441 #
    442 # <circle-descriptor> ::=
    443 #  circle: 
    444 #    radius: REAL # in ]0, INF)
    445 # [  center: <real2>. Default 0,0 ]
    446 # [  segments: INTEGER # in [3, 4096). Default 64 ]
    447 #
    448 #
    449 # <vertices-list> ::=
    450 #   - <real2>
    451 #   - <real2>
    452 #   - <real2>
    453 # [ - <real2> ... ]
    454 #
    455 
    456 # missing clipping definition
    457 - geometry:
    458     - plane:
    459         clip:
    460 ---
    461 # unknown dummy parameter
    462 - geometry:
    463     - plane:
    464         clip:
    465           - dummy: 1
    466 ---
    467 # missing operation name
    468 - geometry:
    469     - plane:
    470         clip:
    471           - operation:
    472 ---
    473 # missing vertices list
    474 - geometry:
    475     - plane:
    476         clip:
    477           - vertices:
    478 ---
    479 # unknown dummy operation
    480 - geometry:
    481     - plane:
    482         clip:
    483           - operation: dummy
    484 ---
    485 # missing contour parameter
    486 - geometry:
    487     - plane:
    488         clip:
    489           - operation: AND
    490 ---
    491 # missing operation parameter
    492 - geometry:
    493     - plane:
    494         clip:
    495           - vertices: [ [1, 2], [3, 4], [6, 7] ]
    496 ---
    497 # vertices list < 3
    498 - geometry:
    499     - plane:
    500         clip:
    501           - vertices: [ [1, 2], [3, 4] ]
    502 ---
    503 # invalid number "dummy"
    504 - geometry:
    505     - plane:
    506         clip:
    507           - operation: AND
    508             vertices: [ ["dummy", 2], [3, 4], [6, 7] ]
    509 ---
    510 # vertices should have 2 values
    511 - geometry:
    512     - plane:
    513         clip:
    514           - operation: AND
    515             vertices: [ [2], [3, 4], [6, 7] ]
    516 ---
    517 # vertices should have 2 values
    518 - geometry:
    519     - plane:
    520         clip:
    521           - operation: AND
    522             vertices: [ [0, 1, 2], [3, 4], [6, 7] ]
    523 ---
    524 # missing circle definition
    525 - geometry:
    526     - plane:
    527         clip:
    528           - circle: 
    529 ---
    530 # missing radius value
    531 - geometry:
    532     - plane:
    533         clip:
    534           - circle: { radius: }
    535 ---
    536 # missing center description
    537 - geometry:
    538     - plane:
    539         clip:
    540           - circle: { center: }
    541 ---
    542 # invalid number "dummy"
    543 - geometry:
    544     - plane:
    545         clip:
    546           - operation: AND
    547             circle: { radius: "dummy" }
    548 ---
    549 # invalid point "dummy"
    550 - geometry:
    551     - plane:
    552         clip:
    553           - operation: AND
    554             circle: { center: "dummy" }
    555 ---
    556 # invalid point 1
    557 - geometry:
    558     - plane:
    559         clip:
    560           - operation: AND
    561             circle: { center: 1 }
    562 ---
    563 # invalid number "dummy"
    564 - geometry:
    565     - plane:
    566         clip:
    567           - operation: AND
    568             circle: { segments: "dummy" }
    569 ---
    570 # 0 invalid
    571 - geometry:
    572     - plane:
    573         clip:
    574           - circle: { radius: 0 }
    575 ---
    576 # 2 invalid
    577 - geometry:
    578     - plane:
    579         clip:
    580           - circle: { segments: 2 }
    581 ---
    582 # missing radius
    583 - geometry:
    584     - plane:
    585         clip:
    586           - circle: { center: [4, -10] }
    587 ---
    588 # missing radius
    589 - geometry:
    590     - plane:
    591         clip:
    592           - circle: { segments: 10 }
    593 ---
    594 # 2x radius
    595 - geometry:
    596     - plane:
    597         clip:
    598           - circle: { radius: 1, radius: 1 }
    599 ---
    600 # 2x center
    601 - geometry:
    602     - plane:
    603         clip:
    604           - circle: { center: [4, -10], center: [4, -10] }
    605 ---
    606 # 2x segments
    607 - geometry:
    608     - plane:
    609         clip:
    610           - circle: { segments: 10, segments: 10 }
    611 ---
    612 # 2x contour
    613 - geometry:
    614     - plane:
    615         clip:
    616           - vertices: [ [1, 2], [3, 4], [6, 7] ]
    617             circle: { radius: 1 }
    618 ---
    619 # 2x operation
    620 - geometry:
    621     - plane:
    622         clip:
    623           - operation: AND
    624             operation: OR
    625 ---
    626 
    627 #
    628 # <cuboid> ::=
    629 #   cuboid:
    630 #     size: <real3*+>
    631 #
    632 
    633 # missing cuboid definition
    634 - geometry: [ { cuboid: } ]
    635 ---
    636 # unknown dummy parameter
    637 - geometry: [ { cuboid: { dummy: 1 } } ]
    638 ---
    639 # missing size values
    640 - geometry: [ { cuboid: { size: } } ]
    641 ---
    642 # size should be a number
    643 - geometry: [ { cuboid: { size: "dummy" } } ]
    644 ---
    645 # invalid number "dummy"
    646 - geometry: [ { cuboid: { size: [1, "dummy", 2] } } ]
    647 ---
    648 # size should have 3 values
    649 - geometry: [ { cuboid: { size: [1, 2] } } ]
    650 ---
    651 # size should have 3 values
    652 - geometry: [ { cuboid: { size: [1, 2, 3, 4] } } ]
    653 ---
    654 # -1 invalid
    655 - geometry: [ { cuboid: { size: [-1, 2, 3] } } ]
    656 ---
    657 # 0 invalid
    658 - geometry: [ { cuboid: { size: [0, 2, 3] } } ]
    659 ---
    660 # 2x size
    661 - geometry: [ { cuboid: { size: [1, 2, 3], size: [1, 2, 3] } } ]
    662 ---
    663 
    664 #
    665 # <cylinder> ::=
    666 #   cylinder:
    667 #     height: REAL # in ]0, INF)
    668 #     radius: REAL # in ]0, INF)
    669 # [   slices: INTEGER ] # in [4, 4096]. Default 16
    670 # [   stacks: INTEGER ] # in [1, 4096]. Default 1
    671 #
    672 
    673 # missing cylinder definition
    674 - geometry: [ { cylinder: } ]
    675 ---
    676 # missing height value
    677 - geometry: [ { cylinder: { height: } } ]
    678 ---
    679 # missing radius value
    680 - geometry: [ { cylinder: { radius: } } ]
    681 ---
    682 # unknown dummy parameter
    683 - geometry: [ { cylinder: { dummy: 1 } } ]
    684 ---
    685 # missing radius
    686 - geometry: [ { cylinder: { height: 1 } } ]
    687 ---
    688 # missing height
    689 - geometry: [ { cylinder: { radius: 1 } } ]
    690 ---
    691 # height should be a number
    692 - geometry: [ { cylinder: { height: "dummy" } } ]
    693 ---
    694 # radius should be a number
    695 - geometry: [ { cylinder: { radius: "dummy" } } ]
    696 ---
    697 # slices should be a number
    698 - geometry: [ { cylinder: { slices: "dummy" } } ]
    699 ---
    700 #   stacks
    701 - geometry: [ { cylinder: {   stacks: "dummy" } } ]
    702 ---
    703 # -1 invalid
    704 - geometry: [ { cylinder: { radius: -1 } } ]
    705 ---
    706 # -1 invalid
    707 - geometry: [ { cylinder: { height: -1 } } ]
    708 ---
    709 # 0 invalid
    710 - geometry: [ { cylinder: { radius: 0 } } ]
    711 ---
    712 # 0 invalid
    713 - geometry: [ { cylinder: { height: 0 } } ]
    714 ---
    715 # 2x height
    716 - geometry: [ { cylinder: { height: 1, height: 1 } } ]
    717 ---
    718 # 2x radius
    719 - geometry: [ { cylinder: { radius: 1, radius: 1 } } ]
    720 ---
    721 # 2x slices
    722 - geometry: [ { cylinder: { slices: 10, slices: 10 } } ]
    723 ---
    724 #   stacks
    725 - geometry: [ { cylinder: {   stacks: 10,   stacks: 10 } } ]
    726 ---
    727 # 1 invalid
    728 - geometry: [ {  cylinder: { height: 1, radius: 1, slices: 1 } } ]
    729 ---
    730 # 4097 invalid
    731 - geometry: [ {  cylinder: { height: 1, radius: 1, slices: 4097 } } ]
    732 ---
    733 # 0 invalid
    734 - geometry: [ {  cylinder: { height: 1, radius: 1,   stacks: 0 } } ]
    735 ---
    736 # 4097 invalid
    737 - geometry: [ {  cylinder: { height: 1, radius: 1,   stacks: 4097 } } ]
    738 ---
    739 # 12.5 invalid
    740 - geometry: [ {  cylinder: { height: 1, radius: 1, slices: 12.5 } } ]
    741 ---
    742 # 12.5 invalid
    743 - geometry: [ {  cylinder: { height: 1, radius: 1,   stacks: 12.5 } } ]
    744 ---
    745 
    746 #
    747 # <obj> ::=
    748 #  obj:
    749 #     path: PATH
    750 #
    751 
    752 # missing obj definition
    753 - geometry: [ { obj: } ]
    754 ---
    755 # missing path
    756 - geometry: [ { obj: { path: } } ]
    757 ---
    758 # unknown dummy parameter
    759 - geometry: [ { obj: { dummy: 1 } } ]
    760 ---
    761 # 2x path
    762 - geometry: [ { obj: { path: "file", path: "file" } } ]
    763 ---
    764 
    765 #
    766 # <parabol> ::=
    767 #   parabol: # x^2 + y^2 - 4*focal*z = 0
    768 #     focal: REAL # in ]0, INF)
    769 #     clip: <polyclip-list>
    770 #
    771 
    772 # missing parabol definition
    773 - geometry: [ { parabol: } ]
    774 ---
    775 # unknown dummy parameter
    776 - geometry: [ { parabol: { dummy: 1 } } ]
    777 ---
    778 # missing focal value
    779 - geometry: [ { parabol: { focal: } } ]
    780 ---
    781 # missing clip value
    782 - geometry: [ { parabol: { clip: } } ]
    783 ---
    784 # focal should be a number
    785 - geometry: [ { parabol: { focal: "dummy" } } ]
    786 ---
    787 # -1 invalid
    788 - geometry: [ { parabol: { focal: -1 } } ]
    789 ---
    790 # 0 invalid
    791 - geometry: [ { parabol: { focal: 0 } } ]
    792 ---
    793 # missing clip parameter
    794 - geometry: [ { parabol: { focal: 10 } } ]
    795 ---
    796 # missing focal parameter
    797 - geometry:
    798     - parabol:
    799         clip:
    800           - operation: AND
    801             vertices: [ [1, 2], [3, 4], [6, 7] ]
    802 ---
    803 # 2x focal
    804 - geometry: [ { parabol: { focal: 10, focal: 10 } } ]
    805 ---
    806 # 2x clip
    807 - geometry:
    808     - parabol:
    809         clip:
    810           - operation: AND
    811             vertices: [ [1, 2], [3, 4], [6, 7] ]
    812         clip:
    813           - operation: AND
    814             vertices: [ [1, 2], [3, 4], [6, 7] ]
    815 ---
    816 # invalid slices
    817 - geometry:
    818     - parabol:
    819         slices: 1
    820         focal: 1
    821         clip:
    822           - operation: AND
    823             vertices: [ [1, 2], [3, 4], [6, 7] ]
    824 ---
    825 # invalid slices
    826 - geometry:
    827     - parabol:
    828         slices: 0
    829         focal: 1
    830         clip:
    831           - operation: AND
    832             vertices: [ [1, 2], [3, 4], [6, 7] ]
    833 ---
    834 # invalid slices
    835 - geometry:
    836     - parabol:
    837         slices: 4097
    838         focal: 1
    839         clip:
    840           - operation: AND
    841             vertices: [ [1, 2], [3, 4], [6, 7] ]
    842 ---
    843 
    844 #
    845 # <parabolic-cylinder> ::=
    846 #   parabolic-cylinder: # y^2 - 4*focal*z = 0
    847 #     focal: REAL # in ]0, INF)
    848 #     clip: <polyclip-list>
    849 #
    850 
    851 # missing parabolic-cylinder definition
    852 - geometry: [ { parabolic-cylinder: } ]
    853 ---
    854 # unknown dummy parameter
    855 - geometry: [ { parabolic-cylinder: { dummy: 1 } } ]
    856 ---
    857 # missing focal value
    858 - geometry: [ { parabolic-cylinder: { focal: } } ]
    859 ---
    860 # missing clip value
    861 - geometry: [ { parabolic-cylinder: { clip: } } ]
    862 ---
    863 # focal should be a number
    864 - geometry: [ { parabolic-cylinder: { focal: "dummy" } } ]
    865 ---
    866 # -1 invalid
    867 - geometry: [ { parabolic-cylinder: { focal: -1 } } ]
    868 ---
    869 # 0 invalid
    870 - geometry: [ { parabolic-cylinder: { focal: 0 } } ]
    871 ---
    872 # missing clip parameter
    873 - geometry: [ { parabolic-cylinder: { focal: 10 } } ]
    874 ---
    875 # missing focal parameter
    876 - geometry:
    877     - parabolic-cylinder:
    878         clip:
    879           - operation: AND
    880             vertices: [ [1, 2], [3, 4], [6, 7] ]
    881 ---
    882 # 2x focal
    883 - geometry: [ { parabolic-cylinder: { focal: 10, focal: 10 } } ]
    884 ---
    885 # 2x clip
    886 - geometry:
    887     - parabolic-cylinder:
    888         clip:
    889           - operation: AND
    890             vertices: [ [1, 2], [3, 4], [6, 7] ]
    891         clip:
    892           - operation: AND
    893             vertices: [ [1, 2], [3, 4], [6, 7] ]
    894 ---
    895 
    896 #
    897 # <hyperbol> ::=
    898 #   hyperbol: # (x^2 + y^2) / a^2 - (z + z0 - 1/2)^2 / b^2 + 1 = 0
    899 #             # with g = img_focal + real_focal; f = real_focal / g;
    900 #             # a^2 = g^2(f - f^2); b = g(f - 1/2); z0 = |b| + g/2
    901 #     focals: <hyperboloid_focals>
    902 #     clip: <polyclip-list>
    903 #
    904 # <hyperboloid_focals> ::=
    905 #       real: REAL # in ]0, INF)
    906 #       image: REAL # in ]0, INF)
    907 #
    908 # missing hyperbol definition
    909 - geometry: [ { hyperbol: } ]
    910 ---
    911 # unknown dummy parameter
    912 - geometry: [ { hyperbol: { dummy: 1 } } ]
    913 ---
    914 # missing focals definition
    915 - geometry: [ { hyperbol: { focals: } } ]
    916 ---
    917 # missing real value
    918 - geometry: [ { hyperbol: { focals: { real: } } } ]
    919 ---
    920 # missing image value
    921 - geometry: [ { hyperbol: { focals: { image: } } } ]
    922 ---
    923 # missing clip value
    924 - geometry: [ { hyperbol: { clip: } } ]
    925 ---
    926 # real should be a number
    927 - geometry: [ { hyperbol: { focals: { real: "dummy" } } } ]
    928 ---
    929 # -1 invalid
    930 - geometry: [ { hyperbol: { focals: { real: -1 } } } ]
    931 ---
    932 # 0 invalid
    933 - geometry: [ { hyperbol: { focals: { real: 0 } } } ]
    934 ---
    935 # image should be a number
    936 - geometry: [ { hyperbol: { focals: { image: "dummy" } } } ]
    937 ---
    938 # -1 invalid
    939 - geometry: [ { hyperbol: { focals: { image: -1 } } } ]
    940 ---
    941 # 0 invalid
    942 - geometry: [ { hyperbol: { focals: { image: 0 } } } ]
    943 ---
    944 # missing clip parameter
    945 - geometry: [ { hyperbol: { focals: { real: 1, image: 1 } } } ]
    946 ---
    947 # missing real parameter
    948 - geometry:
    949     - hyperbol:
    950         focals: { image: 1 }
    951         clip:
    952           - operation: AND
    953             vertices: [ [1, 2], [3, 4], [6, 7] ]
    954 ---
    955 # missing image parameter
    956 - geometry:
    957     - hyperbol:
    958         focals: { real: 10 }
    959         clip:
    960           - operation: AND
    961             vertices: [ [1, 2], [3, 4], [6, 7] ]
    962 ---
    963 # 2x focals
    964 - geometry:
    965     - hyperbol:
    966         focals: { real: 1, image: 1 }
    967         focals: { real: 1, image: 1 }
    968 ---
    969 # 2x real
    970 - geometry: [ { hyperbol: { focals: { real: 1, real: 1 } } } ]
    971 ---
    972 # 2x image
    973 - geometry: [ { hyperbol: { focals: { image: 1, image: 1 } } } ]
    974 ---
    975 # 2x clip
    976 - geometry:
    977     - hyperbol:
    978         clip:
    979           - operation: AND
    980             vertices: [ [1, 2], [3, 4], [6, 7] ]
    981         clip:
    982           - operation: AND
    983             vertices: [ [1, 2], [3, 4], [6, 7] ]
    984 ---
    985 
    986 #
    987 # <plane> ::=
    988 #   plane:
    989 #     clip: <polyclip-list>
    990 #
    991 
    992 # missing plane definition
    993 - geometry: [ { plane: } ]
    994 ---
    995 # unknown dummy parameter
    996 - geometry: [ { plane: { dummy: 1 } } ]
    997 ---
    998 # 2x clip
    999 - geometry:
   1000     - plane:
   1001         clip:
   1002           - operation: AND
   1003             vertices: [ [1, 2], [3, 4], [6, 7] ]
   1004         clip:
   1005           - operation: AND
   1006             vertices: [ [1, 2], [3, 4], [6, 7] ]
   1007 ---
   1008 # invalid slices
   1009 - geometry: &target
   1010   - plane:
   1011       slices: 0
   1012       clip:
   1013        - operation: AND
   1014          vertices:
   1015          - [-0.50, -0.50]
   1016          - [-0.50, 0.50]
   1017          - [0.50, 0.50]
   1018          - [0.50, -0.50]
   1019 ---
   1020 # invalid slices
   1021 - geometry: &target
   1022   - plane:
   1023       slices: 4097
   1024       clip:
   1025        - operation: AND
   1026          vertices:
   1027          - [-0.50, -0.50]
   1028          - [-0.50, 0.50]
   1029          - [0.50, 0.50]
   1030          - [0.50, -0.50]
   1031 
   1032 ---
   1033 #
   1034 # <sphere> ::=
   1035 #   sphere:
   1036 #     radius: REAL # in ]0, INF)
   1037 # [   slices: INTEGER ] # Default 16
   1038 #
   1039 
   1040 # missing sphere definition
   1041 - geometry: [ { sphere: } ]
   1042 ---
   1043 # unknown dummy parameter
   1044 - geometry: [ { sphere: { dummy: 1 } } ]
   1045 ---
   1046 # missing radius parameter
   1047 - geometry: [ { sphere: { slices: 10 } } ]
   1048 ---
   1049 # radius should be a number
   1050 - geometry: [ { sphere: { radius: "dummy" } } ]
   1051 ---
   1052 # slices should be a number
   1053 - geometry: [ { sphere: { slices: "dummy" } } ]
   1054 ---
   1055 # stacks should be a number
   1056 - geometry: [ { sphere: { stacks: "dummy" } } ]
   1057 ---
   1058 # -1 invalid
   1059 - geometry: [ { sphere: { radius: -1 } } ]
   1060 ---
   1061 # 0 invalid
   1062 - geometry: [ { sphere: { radius: 0 } } ]
   1063 ---
   1064 # 0 invalid
   1065 - geometry: [ { sphere: { radius: 1, slices: 0 } } ]
   1066 ---
   1067 # 4097 invalid
   1068 - geometry: [ { sphere: { radius: 1, slices: 4097 } } ]
   1069 ---
   1070 # 0 invalid
   1071 - geometry: [ { sphere: { radius: 1, stacks: 0 } } ]
   1072 ---
   1073 # 4097 invalid
   1074 - geometry: [ { sphere: { radius: 1, stacks: 4097 } } ]
   1075 ---
   1076 # 2x radius
   1077 - geometry: [ { sphere: { radius: 1,  radius: 1 } } ]
   1078 ---
   1079 # 2x slices
   1080 - geometry: [ { sphere: { slices: 10,  slices: 10 } } ]
   1081 ---
   1082 # 2x stacks
   1083 - geometry: [ { sphere: { stacks: 10,  stacks: 10 } } ]
   1084 ---
   1085 
   1086 #
   1087 # <stl> ::=
   1088 #  stl:
   1089 #     path: PATH
   1090 #
   1091 
   1092 # missing stl definition
   1093 - geometry: [ { stl: } ]
   1094 ---
   1095 # missing path
   1096 - geometry: [ { stl: { path: } } ]
   1097 ---
   1098 # unknown dummy parameter
   1099 - geometry: [ { stl: { dummy: 1 } } ]
   1100 ---
   1101 # 2x path
   1102 - geometry: [ { stl: { path: "file", path: "file" } } ]
   1103 ---
   1104 
   1105 #
   1106 # <x_pivot> ::=
   1107 #   x_pivot:
   1108 #     point: <real3>
   1109 #     normal: <real3>
   1110 #     <target>
   1111 #
   1112 # <target> ::=
   1113 #   target:
   1114 #     anchor: <anchor-identifier>
   1115 #   | direction: <real3>
   1116 #   | position: <real3>
   1117 #   | <sun>
   1118 #
   1119 
   1120 # missing x_pivot definition
   1121 - entity:
   1122     x_pivot:
   1123 ---
   1124 # unknown dummy parameter
   1125 - entity:
   1126     x_pivot:
   1127       dummy: 1
   1128 ---
   1129 # missing point definition
   1130 - entity:
   1131     x_pivot:
   1132       point:
   1133 ---
   1134 # missing normal definition
   1135 - entity:
   1136     x_pivot:
   1137       normal:
   1138 ---
   1139 # missing target definition
   1140 - entity:
   1141     x_pivot:
   1142       target:
   1143 ---
   1144 # point should be a number
   1145 - entity:
   1146     x_pivot:
   1147       point: "dummy"
   1148 ---
   1149 # point should have 3 values
   1150 - entity:
   1151     x_pivot:
   1152       point: [ -4, 5.2 ]
   1153 ---
   1154 # point should have 3 values
   1155 - entity:
   1156     x_pivot:
   1157       point: [ -4, 5.2, 0, 1 ]
   1158 ---
   1159 # normal should be a number
   1160 - entity:
   1161     x_pivot:
   1162       normal: "dummy"
   1163 ---
   1164 # normal should have 3 values
   1165 - entity:
   1166     x_pivot:
   1167       normal: [ -4, 5.2 ]
   1168 ---
   1169 # normal should have 3 values
   1170 - entity:
   1171     x_pivot:
   1172       normal: [ -4, 5.2, 0, 1 ]
   1173 ---
   1174 # target should be a <target>
   1175 - entity:
   1176     x_pivot:
   1177       target: "dummy"
   1178 ---
   1179 # missing anchor definition
   1180 - entity:
   1181     x_pivot:
   1182       target:
   1183         anchor:
   1184 ---
   1185 # missing direction definition
   1186 - entity:
   1187     x_pivot:
   1188       target:
   1189         direction:
   1190 ---
   1191 # missing position definition
   1192 - entity:
   1193     x_pivot:
   1194       target:
   1195         position:
   1196 ---
   1197 # undefined anchor
   1198 - entity:
   1199     x_pivot:
   1200       target:
   1201         anchor: dummy
   1202 ---
   1203 # direction should be a number
   1204 - entity:
   1205     x_pivot:
   1206       target:
   1207         direction: "dummy"
   1208 ---
   1209 # direction should have 3 values
   1210 - entity:
   1211     x_pivot:
   1212       target:
   1213         direction: [ -4, 5.2 ]
   1214 ---
   1215 # direction should have 3 values
   1216 - entity:
   1217     x_pivot:
   1218       target:
   1219         direction: [ -4, 5.2, 0, 1 ]
   1220 ---
   1221 # position should be a number
   1222 - entity:
   1223     x_pivot:
   1224       target:
   1225         position: "dummy"
   1226 ---
   1227 # position should have 3 values
   1228 - entity:
   1229     x_pivot:
   1230       target:
   1231         position: [ -4, 5.2 ]
   1232 ---
   1233 # position should have 3 values
   1234 - entity:
   1235     x_pivot:
   1236       target:
   1237         position: [ -4, 5.2, 0, 1 ]
   1238 ---
   1239 # sun should be a <sun>
   1240 - entity:
   1241     x_pivot:
   1242       target: { sun: "dummy" }
   1243 ---
   1244 # missing point
   1245 - sun: &sun { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
   1246 - entity:
   1247     x_pivot:
   1248       normal: [ -4, 5.2, 0 ]
   1249       target: { sun: *sun }
   1250 ---
   1251 # missing normal
   1252 - sun: &sun { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
   1253 - entity:
   1254     x_pivot:
   1255       point: [ -4, 5.2, 0 ]
   1256       target: { sun: *sun }
   1257 ---
   1258 # missing target
   1259 - entity:
   1260     x_pivot:
   1261       point: [ -4, 5.2, 0 ]
   1262       normal: [ -4, 5.2, 0 ]
   1263 ---
   1264 # 2x point
   1265 - entity:
   1266     x_pivot:
   1267       point: [ -4, 5.2, 0 ]
   1268       point: [ -4, 5.2, 0 ]
   1269 ---
   1270 # 2x normal
   1271 - entity:
   1272     x_pivot:
   1273       normal: [ -4, 5.2, 0 ]
   1274       normal: [ -4, 5.2, 0 ]
   1275 ---
   1276 # 2x target
   1277 - sun: &sun { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
   1278 - entity:
   1279     x_pivot:
   1280       target: { sun: *sun }
   1281       target: { sun: *sun }
   1282 ---
   1283 
   1284 # <zx_pivot> ::=
   1285 #   zx_pivot:
   1286 #     spacing: REAL # in [0, INF)
   1287 #     ref_point: <real3>
   1288 #     <target>
   1289 #
   1290 # <target> ::=
   1291 #   target:
   1292 #     anchor: <anchor-identifier>
   1293 #   | direction: <real3>
   1294 #   | position: <real3>
   1295 #   | <sun>
   1296 #
   1297 
   1298 # missing zx_pivot definition
   1299 - entity:
   1300     zx_pivot:
   1301 ---
   1302 # unknown dummy parameter
   1303 - entity:
   1304     zx_pivot:
   1305       dummy: 1
   1306 ---
   1307 # missing spacing definition
   1308 - entity:
   1309     zx_pivot:
   1310       spacing:
   1311 ---
   1312 # missing ref_point definition
   1313 - entity:
   1314     zx_pivot:
   1315       ref_point:
   1316 ---
   1317 # missing target definition
   1318 - entity:
   1319     zx_pivot:
   1320       target:
   1321 ---
   1322 # spacing should be a number
   1323 - entity:
   1324     zx_pivot:
   1325       spacing: "dummy"
   1326 ---
   1327 # -1 invalid
   1328 - entity:
   1329     zx_pivot:
   1330       spacing: -1
   1331 ---
   1332 # spacing should be a number
   1333 - entity:
   1334     zx_pivot:
   1335       ref_point: "dummy"
   1336 ---
   1337 # ref_point should have 3 values
   1338 - entity:
   1339     zx_pivot:
   1340       ref_point: [ -4, 5.2 ]
   1341 ---
   1342 # ref_point should have 3 values
   1343 - entity:
   1344     zx_pivot:
   1345       ref_point: [ -4, 5.2, 0, 1 ]
   1346 ---
   1347 # target should be a <target>
   1348 - entity:
   1349     zx_pivot:
   1350       target: "dummy"
   1351 ---
   1352 # missing anchor definition
   1353 - entity:
   1354     zx_pivot:
   1355       target:
   1356         anchor:
   1357 ---
   1358 # missing direction definition
   1359 - entity:
   1360     zx_pivot:
   1361       target:
   1362         direction:
   1363 ---
   1364 # missing position definition
   1365 - entity:
   1366     zx_pivot:
   1367       target:
   1368         position:
   1369 ---
   1370 # undefined anchor
   1371 - entity:
   1372     zx_pivot:
   1373       target:
   1374         anchor: dummy
   1375 ---
   1376 # direction should be a number
   1377 - entity:
   1378     zx_pivot:
   1379       target:
   1380         direction: "dummy"
   1381 ---
   1382 # direction should have 3 values
   1383 - entity:
   1384     zx_pivot:
   1385       target:
   1386         direction: [ -4, 5.2 ]
   1387 ---
   1388 # direction should have 3 values
   1389 - entity:
   1390     zx_pivot:
   1391       target:
   1392         direction: [ -4, 5.2, 0, 1 ]
   1393 ---
   1394 # position should be a number
   1395 - entity:
   1396     zx_pivot:
   1397       target:
   1398         position: "dummy"
   1399 ---
   1400 # position should have 3 values
   1401 - entity:
   1402     zx_pivot:
   1403       target:
   1404         position: [ -4, 5.2 ]
   1405 ---
   1406 # position should have 3 values
   1407 - entity:
   1408     zx_pivot:
   1409       target:
   1410         position: [ -4, 5.2, 0, 1 ]
   1411 ---
   1412 # sun should be a <sun>
   1413 - entity:
   1414     zx_pivot:
   1415       target: { sun: "dummy" }
   1416 ---
   1417 # missing point
   1418 - sun: &sun { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
   1419 - entity:
   1420     zx_pivot:
   1421       normal: [ -4, 5.2, 0 ]
   1422       target: { sun: *sun }
   1423 ---
   1424 # missing normal
   1425 - sun: &sun { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
   1426 - entity:
   1427     zx_pivot:
   1428       point: [ -4, 5.2, 0 ]
   1429       target: { sun: *sun }
   1430 ---
   1431 # missing target
   1432 - entity:
   1433     zx_pivot:
   1434       point: [ -4, 5.2, 0 ]
   1435       normal: [ -4, 5.2, 0 ]
   1436 ---
   1437 # 2x spacing
   1438 - entity:
   1439     zx_pivot:
   1440       spacing: 1
   1441       spacing: 1
   1442 ---
   1443 # 2x ref_point
   1444 - entity:
   1445     zx_pivot:
   1446       ref_point: [ 0, 5.2, 0 ]
   1447       ref_point: [ 0, 5.2, 0 ]
   1448 ---
   1449 # 2x target
   1450 - sun: &sun { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
   1451 - entity:
   1452     zx_pivot:
   1453       target: { sun: *sun }
   1454       target: { sun: *sun }
   1455 ---
   1456 
   1457 #
   1458 # <anchors> ::=
   1459 #   anchors:
   1460 #     - <anchor-data>
   1461 # [   - <anchor-data> ... ]
   1462 #
   1463 # <anchor-data> ::=
   1464 #   name: STRING
   1465 #   <position-description>
   1466 #
   1467 # <position-description> ::=
   1468 #   position: <real3> | hyperboloid_image_focals: <hyperboloid_focals>
   1469 #
   1470 
   1471 # missing anchors definition
   1472 - entity:
   1473     anchors:
   1474 ---
   1475 # missing name definition
   1476 - entity:
   1477     anchors: [ name: ]
   1478 ---
   1479 # missing position definition
   1480 - entity:
   1481     anchors: [ position: ]
   1482 ---
   1483 # missing hyperboloid_image_focals definition
   1484 - entity:
   1485     anchors: [ { hyperboloid_image_focals: } ]
   1486 ---
   1487 # missing position-description
   1488 - entity:
   1489     anchors: [ { name: "anchor" } ]
   1490 ---
   1491 # position should have 3 values
   1492 - entity:
   1493     anchors: [ { name: "anchor", position: [ -4, 5.2 ] } ]
   1494 ---
   1495 # position should have 3 values
   1496 - entity:
   1497     anchors: [ { name: "anchor", position: [ -4, 5.2, 0, 5 ] } ]
   1498 ---
   1499 # missing name
   1500 - entity:
   1501     anchors: [ { position: [ -4, 5.2, 0 ] } ]
   1502 ---
   1503 # 2x name
   1504 - entity:
   1505     anchors: [ { name: "anchor", name: "anchor" } ]
   1506 ---
   1507 # 2x position-description
   1508 - entity:
   1509     anchors: [ { position: [ -4, 5.2, 0 ], position: [ -4, 5.2, 0 ] } ]
   1510 ---
   1511 # 2x position-description
   1512 - entity:
   1513     anchors:
   1514     - hyperboloid_image_focals: { real: 1, image: 1 }
   1515       hyperboloid_image_focals: { real: 1, image: 1 }
   1516 ---
   1517 # 2x position-description
   1518 - entity:
   1519     anchors:
   1520     - hyperboloid_image_focals: { real: 1, image: 1 }
   1521       position: [ -4, 5.2, 0 ]
   1522 ---
   1523 # 2 anchors with same name
   1524 - entity:
   1525     anchors:
   1526     - name: "anchor"
   1527       position: [ -4, 5.2, 0 ]
   1528     - name: "anchor"
   1529       position: [ -4, 5.2, 0 ]
   1530 ---
   1531 
   1532 #
   1533 # <entity> ::=
   1534 #   entity:
   1535 #     <entity-data>
   1536 #
   1537 # <entity-data> ::=
   1538 #   name: STRING
   1539 # [ <geometry-data> | <x_pivot> | <zx_pivot> ]
   1540 # [ <anchors> ]
   1541 # [ <transform> ]
   1542 # [ <children>  ]
   1543 #
   1544 # <geometry-data> ::=
   1545 #   primary: INTEGER # in [0, 1]
   1546 #   <geometry>
   1547 #
   1548 
   1549 # missing entity definition
   1550 - entity:
   1551 ---
   1552 # unknown dummy parameter
   1553 - entity: { dummy: 0 }
   1554 ---
   1555 # missing name value
   1556 - entity: { name: }
   1557 ---
   1558 # reserved word used as name
   1559 - entity: { name: "self" }
   1560 ---
   1561 # missing primary value
   1562 - entity: { primary: }
   1563 ---
   1564 # missing geometry value
   1565 - entity: { geometry: }
   1566 ---
   1567 # missing x_pivot value
   1568 - entity: { x_pivot: }
   1569 ---
   1570 # missing zx_pivot value
   1571 - entity: { zx_pivot: }
   1572 ---
   1573 # missing anchors value
   1574 - entity: { anchors: }
   1575 ---
   1576 # missing transform value
   1577 - entity: { transform: }
   1578 ---
   1579 # missing children value
   1580 - entity: { children: }
   1581 ---
   1582 # primary should be a number
   1583 - entity: { primary: "dummy" }
   1584 ---
   1585 # -1 invalid
   1586 - entity: { primary: -1 }
   1587 ---
   1588 # 2 invalid
   1589 - entity: { primary: 2 }
   1590 ---
   1591 # missing entity name
   1592 - entity:
   1593     primary: 1
   1594     geometry:
   1595       - stl: { path: "file" }
   1596         material: { matte: { reflectivity: 1 } }
   1597 ---
   1598 # missing entity primary
   1599 - entity:
   1600     name: "entity"
   1601     geometry:
   1602       - stl: { path: "file" }
   1603         material: { matte: { reflectivity: 1 } }
   1604 ---
   1605 # primary invalid in this context
   1606 - entity:
   1607     name: "entity"
   1608     primary: 1
   1609 ---
   1610 # 2x name
   1611 - entity: { name: "ent", name: "ent" }
   1612 ---
   1613 # 2x primary
   1614 - entity: { primary: 1, primary: 1 }
   1615 ---
   1616 # cannot define both geometry and x_pivot
   1617 - sun: &sun { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
   1618 - entity:
   1619     x_pivot:
   1620       point: [ -4, 5.2, 0 ]
   1621       normal: [ -4, 5.2, 0 ]
   1622       target: { sun: *sun }
   1623     geometry: [ { stl: { path: "file" } } ]
   1624 ---
   1625 # cannot define both geometry and zx_pivot
   1626 - sun: &sun { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
   1627 - entity:
   1628     zx_pivot:
   1629       spacing: 1
   1630       ref_point: [ 0, 5.2, 0 ]
   1631       target: { sun: *sun }
   1632     geometry: [ { stl: { path: "file" } } ]
   1633 ---
   1634 # cannot define both x_pivot and zx_pivot
   1635 - sun: &sun { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
   1636 - entity:
   1637     x_pivot:
   1638       point: [ -4, 5.2, 0 ]
   1639       normal: [ -4, 5.2, 0 ]
   1640       target: { sun: *sun }
   1641     zx_pivot:
   1642       spacing: 1
   1643       ref_point: [ 0, 5.2, 0 ]
   1644       target: { sun: *sun }
   1645 ---
   1646 # 2x anchors
   1647 - entity:
   1648     anchors:
   1649       - name: "anchor1"
   1650         position: [ -4, 5.2, 0 ]
   1651     anchors:
   1652       - name: "anchor2"
   1653         position: [ -4, 5.2, 0 ]
   1654 ---
   1655 # 2x transform
   1656 - entity:
   1657     transform: { rotation: [ -4, 5.2, 1 ] }
   1658     transform: { rotation: [ -4, 5.2, 1 ] }
   1659 ---
   1660 # 2x children
   1661 - entity:
   1662     children:
   1663       - name: "child1"
   1664     children:
   1665       - name: "child2"
   1666 ---
   1667 # 2 entities with the same name
   1668 - entity:
   1669     name: "foo"
   1670     primary: 1
   1671     geometry:
   1672       - stl: { path: "file" }
   1673         material: { matte: { reflectivity: 1 } }
   1674 - entity:
   1675     name: "foo"
   1676     primary: 1
   1677     geometry:
   1678       - stl: { path: "file" }
   1679         material: { matte: { reflectivity: 1 } }
   1680 ---
   1681 
   1682 # <template> ::=
   1683 #   template:
   1684 #     <entity-data>
   1685 #
   1686 # <entity-data> ::=
   1687 #   name: STRING
   1688 # [ <geometry-data> | <x_pivot> | <zx_pivot> ]
   1689 # [ <anchors> ]
   1690 # [ <transform> ]
   1691 # [ <children>  ]
   1692 #
   1693 # <geometry-data> ::=
   1694 #   primary: INTEGER # in [0, 1]
   1695 #   <geometry>
   1696 #
   1697 
   1698 # missing template definition
   1699 - template: &temp
   1700 - entity: *temp
   1701 ---
   1702 # unknown dummy parameter
   1703 - template: &temp { dummy: 0 }
   1704 - entity: *temp
   1705 ---
   1706 # missing name value
   1707 - template: &temp { name: }
   1708 - entity: *temp
   1709 ---
   1710 # missing primary value
   1711 - template: &temp { primary: }
   1712 - entity: *temp
   1713 ---
   1714 # missing geometry value
   1715 - template: &temp { geometry: }
   1716 - entity: *temp
   1717 ---
   1718 # missing x_pivot value
   1719 - template: &temp { x_pivot: }
   1720 - entity: *temp
   1721 ---
   1722 # missing zx_pivot value
   1723 - template: &temp { zx_pivot: }
   1724 - entity: *temp
   1725 ---
   1726 # missing anchors value
   1727 - template: &temp { anchors: }
   1728 - entity: *temp
   1729 ---
   1730 # missing transform value
   1731 - template: &temp { transform: }
   1732 - entity: *temp
   1733 ---
   1734 # missing children value
   1735 - template: &temp { children: }
   1736 - entity: *temp
   1737 ---
   1738 # primary should be a number
   1739 - template: &temp { primary: "dummy" }
   1740 ---
   1741 # -1 invalid
   1742 - template: &temp { primary: -1 }
   1743 - entity: *temp
   1744 ---
   1745 # 2 invalid
   1746 - template: &temp { primary: 2 }
   1747 - entity: *temp
   1748 ---
   1749 # missing template name
   1750 - template: &temp
   1751     geometry:
   1752       - stl: { path: "file" }
   1753         material: { matte: { reflectivity: 1 } }
   1754 - entity: *temp
   1755 ---
   1756 # missing template primary
   1757 - template: &temp
   1758     name: "entity"
   1759     geometry:
   1760       - stl: { path: "file" }
   1761         material: { matte: { reflectivity: 1 } }
   1762 - entity: *temp
   1763 ---
   1764 # primary invalid in this context
   1765 - template: &temp
   1766     name: "entity"
   1767     primary: 1
   1768 - entity: *temp
   1769 ---
   1770 # 2x name
   1771 - template: &temp { name: "ent", name: "ent" }
   1772 - entity: *temp
   1773 ---
   1774 # 2x primary
   1775 - template: &temp { primary: 1, primary: 1 }
   1776 - entity: *temp
   1777 ---
   1778 # cannot define both geometry and x_pivot
   1779 - sun: &sun { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
   1780 - template: &temp
   1781     x_pivot:
   1782       point: [ -4, 5.2, 0 ]
   1783       normal: [ -4, 5.2, 0 ]
   1784       target: { sun: *sun }
   1785     geometry: [ { stl: { path: "file" } } ]
   1786 - entity: *temp
   1787 ---
   1788 # cannot define both geometry and zx_pivot
   1789 - sun: &sun { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
   1790 - template: &temp
   1791     zx_pivot:
   1792       spacing: 1
   1793       ref_point: [ 0, 5.2, 0 ]
   1794       target: { sun: *sun }
   1795     geometry: [ { stl: { path: "file" } } ]
   1796 - entity: *temp
   1797 ---
   1798 # cannot define both x_pivot and zx_pivot
   1799 - sun: &sun { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
   1800 - template: &temp
   1801     x_pivot:
   1802       point: [ -4, 5.2, 0 ]
   1803       normal: [ -4, 5.2, 0 ]
   1804       target: { sun: *sun }
   1805     zx_pivot:
   1806       spacing: 1
   1807       ref_point: [ 0, 5.2, 0 ]
   1808       target: { sun: *sun }
   1809 - entity: *temp
   1810 ---
   1811 # 2x anchors
   1812 - template: &temp
   1813     anchors:
   1814       - name: "anchor1"
   1815         position: [ -4, 5.2, 0 ]
   1816     anchors:
   1817       - name: "anchor2"
   1818         position: [ -4, 5.2, 0 ]
   1819 - entity: *temp
   1820 ---
   1821 # 2x transform
   1822 - template: &temp
   1823     transform: { rotation: [ -4, 5.2, 1 ] }
   1824     transform: { rotation: [ -4, 5.2, 1 ] }
   1825 - entity: *temp
   1826 ---
   1827 # 2x children
   1828 - template: &temp
   1829     children:
   1830       - name: "child1"
   1831     children:
   1832       - name: "child2"
   1833 - entity: *temp
   1834 ---
   1835 # 2 templates with the same name
   1836 - template: &temp1
   1837     name: "foo"
   1838     primary: 1
   1839     geometry:
   1840       - stl: { path: "file" }
   1841         material: { matte: { reflectivity: 1 } }
   1842 - template: &temp2
   1843     name: "foo"
   1844     primary: 1
   1845     geometry:
   1846       - stl: { path: "file" }
   1847         material: { matte: { reflectivity: 1 } }
   1848 - entity: *temp1
   1849 - entity: *temp2
   1850 ---
   1851 
   1852 #
   1853 # <transform> ::=
   1854 #   transform:
   1855 #     translation: <real3>
   1856 #     rotation: <real3>
   1857 #
   1858 
   1859 # missing rotation parameters
   1860 - entity: { transform: { rotation: } }
   1861 ---
   1862 # missing translation parameters
   1863 - entity: { transform: { translation: } }
   1864 ---
   1865 # rotation should have 3 values
   1866 - entity: { transform: { rotation: [ -4, 5.2 ] } }
   1867 ---
   1868 # rotation should have 3 values
   1869 - entity: { transform: { rotation: [ -4, 5.2, 0, 1 ] } }
   1870 ---
   1871 # translation should have 3 values
   1872 - entity: { transform: { translation: [ -4, 5.2 ] } }
   1873 ---
   1874 # translation should have 3 values
   1875 - entity: { transform: { translation: [ -4, 5.2, 0, 1 ] } }
   1876 ---
   1877 # 2x rotation
   1878 - entity:
   1879     transform:
   1880       rotation: [ -4, 5.2, -6.5 ]
   1881       rotation: [ -4, 5.2, -6.5 ]
   1882 ---
   1883 # 2x translation
   1884 - entity:
   1885     transform:
   1886       translation: [ -4, 5.2, -6.5 ]
   1887       translation: [ -4, 5.2, -6.5 ]
   1888 ---
   1889 
   1890 #
   1891 # <geometry> ::=
   1892 #   geometry:
   1893 #     - <object>
   1894 # [   - <object> ... ]
   1895 #
   1896 # <object> ::=
   1897 #   <shape>
   1898 #   <material>
   1899 # [ <transform> ]
   1900 #
   1901 
   1902 # missing geometry definition
   1903 - geometry:
   1904 ---
   1905 # unknown dummy parameter
   1906 - geometry:
   1907   - dummy: 1
   1908 ---
   1909 # missing material definition
   1910 - geometry:
   1911   - stl: { path: "file" }
   1912 ---
   1913 # missing shape definition
   1914 - geometry:
   1915   - material: { matte: { reflectivity: 1 } }
   1916 ---
   1917 # 2x shape
   1918 - geometry:
   1919   - stl: { path: "file" }
   1920     stl: { path: "file" }
   1921 ---
   1922 # 2x material
   1923 - geometry:
   1924   - material: { matte: { reflectivity: 1 } }
   1925     material: { matte: { reflectivity: 1 } }
   1926 ---
   1927 # 2x transform
   1928 - geometry:
   1929   - transform: { rotation: [ -4, 5.2, -6.5 ] }
   1930     transform: { rotation: [ -4, 5.2, -6.5 ] }
   1931 ---
   1932 
   1933 #
   1934 # <atmosphere> ::=
   1935 #   atmosphere: 
   1936 #     extinction: <mtl-data> # in [0, 1]
   1937 #
   1938 
   1939 # missing atmosphere definition
   1940 - atmosphere:
   1941 ---
   1942 # unknown dummy parameter
   1943 - atmosphere:
   1944     dummy: 1
   1945 ---
   1946 # missing extinction definition
   1947 - atmosphere:
   1948     extinction: 
   1949 ---
   1950 # extinction should be a number
   1951 - atmosphere:
   1952     extinction: "dummy"
   1953 ---
   1954 # 2 invalid
   1955 - atmosphere:
   1956     extinction: 2
   1957 ---
   1958 # 0 invalid
   1959 - atmosphere:
   1960     extinction: [{wavelength: 0, data: 1}]
   1961 ---
   1962 # 2 invalid
   1963 - atmosphere:
   1964     extinction: [{wavelength: 0, data: 2}]
   1965 ---
   1966 # 2x extinction
   1967 - atmosphere:
   1968     extinction: 0.1
   1969     extinction: [{wavelength: 1, data: 1}]
   1970 ---
   1971 
   1972 #
   1973 # <solar-factory> ::=
   1974 #   <sun>
   1975 #   <items>
   1976 # [ <atmosphere> ]
   1977 #
   1978 # <items> ::=
   1979 #   - <item>
   1980 # [ - <item> ... ]
   1981 #
   1982 # <item> ::=
   1983 #     <geometry>
   1984 #   | <material>
   1985 #   | <entity>
   1986 #   | <template>
   1987 #
   1988 
   1989 # unknown item dummy
   1990 - dummy: 1
   1991 ---
   1992 # missing sun in document
   1993 - entity:
   1994     name: foo
   1995     primary: 1
   1996     geometry:
   1997       - cuboid: { size: [1, 2, 3] }
   1998         material: { matte: { reflectivity: 1 } }
   1999 ---
   2000 # 2x sun
   2001 - sun: { dni: 1000, spectrum: [{wavelength: 1, data: 1}] }
   2002 - sun: { dni: 1000, spectrum: [{wavelength: 1, data: 1}] }
   2003 ---
   2004 # 2x atmosphere
   2005 - atmosphere:
   2006     extinction: 0.1
   2007 - atmosphere:
   2008     extinction: 0.1