1<?php 2 3/** 4 * Hoa 5 * 6 * 7 * @license 8 * 9 * New BSD License 10 * 11 * Copyright © 2007-2017, Hoa community. All rights reserved. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions are met: 15 * * Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * * Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in the 19 * documentation and/or other materials provided with the distribution. 20 * * Neither the name of the Hoa nor the names of its contributors may be 21 * used to endorse or promote products derived from this software without 22 * specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE 28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 32 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 34 * POSSIBILITY OF SUCH DAMAGE. 35 */ 36 37namespace Hoa\Compiler\Test\Unit\Llk\Rule; 38 39use Hoa\Compiler as LUT; 40use Hoa\Compiler\Llk\Rule\Repetition as SUT; 41use Hoa\Test; 42 43/** 44 * Class \Hoa\Compiler\Test\Unit\Llk\Rule\Repetition. 45 * 46 * Test suite of a repetition rule. 47 * 48 * @copyright Copyright © 2007-2017 Hoa community 49 * @license New BSD License 50 */ 51class Repetition extends Test\Unit\Suite 52{ 53 public function case_is_a_rule() 54 { 55 $this 56 ->when($result = new SUT('foo', 7, 42, [], 'bar')) 57 ->then 58 ->object($result) 59 ->isInstanceOf(LUT\Llk\Rule::class); 60 } 61 62 public function case_constructor() 63 { 64 $this 65 ->given( 66 $name = 'foo', 67 $min = 7, 68 $max = 42, 69 $children = [], 70 $id = 'bar' 71 ) 72 ->when($result = new SUT($name, $min, $max, $children, $id)) 73 ->then 74 ->string($result->getName()) 75 ->isEqualTo($name) 76 ->integer($result->getMin()) 77 ->isEqualTo($min) 78 ->integer($result->getMax()) 79 ->isEqualTo($max) 80 ->array($result->getChildren()) 81 ->isEqualTo($children) 82 ->string($result->getNodeId()) 83 ->isEqualTo($id) 84 ->boolean($result->isInfinite()) 85 ->isFalse(); 86 } 87 88 public function case_constructor_min_and_max_are_casted_and_bounded() 89 { 90 $this 91 ->given( 92 $name = 'foo', 93 $min = '-7', 94 $max = '42', 95 $children = [], 96 $id = 'bar' 97 ) 98 ->when($result = new SUT($name, $min, $max, $children, $id)) 99 ->then 100 ->integer($result->getMin()) 101 ->isEqualTo(0) 102 ->integer($result->getMax()) 103 ->isEqualTo(42) 104 ->boolean($result->isInfinite()) 105 ->isFalse(); 106 } 107 108 public function case_constructor_min_is_greater_than_max() 109 { 110 $this 111 ->given( 112 $name = 'foo', 113 $min = 2, 114 $max = 1, 115 $children = [], 116 $id = 'bar' 117 ) 118 ->exception(function () use ($name, $min, $max, $children, $id) { 119 new SUT($name, $min, $max, $children, $id); 120 }) 121 ->isInstanceOf(LUT\Exception\Rule::class) 122 ->hasMessage('Cannot repeat with a min (2) greater than max (1).'); 123 } 124 125 public function case_constructor_infinite_max() 126 { 127 $this 128 ->given( 129 $name = 'foo', 130 $min = 2, 131 $max = -1, 132 $children = [], 133 $id = 'bar' 134 ) 135 ->when($result = new SUT($name, $min, $max, $children, $id)) 136 ->then 137 ->integer($result->getMin()) 138 ->isEqualTo(2) 139 ->integer($result->getMax()) 140 ->isEqualTo(-1) 141 ->boolean($result->isInfinite()) 142 ->isTrue(); 143 } 144 145 public function case_get_min() 146 { 147 return $this->case_constructor(); 148 } 149 150 public function case_get_max() 151 { 152 return $this->case_constructor(); 153 } 154} 155