function test_addDefault_object()
 {
     $rvm = new ReturnValuesManager('classe');
     $rvm->setReturnValue('metodo', 'primo', 1)->setReturnObjectDefault('metodo', 'pdefault');
     FakeObjectGenerator::generate($rvm, new CodeGenerator(null));
     //echo FakeObjectGenerator::returnedCode();die();
     $classe = "class classe{\n//timing\n     private static \$times = array();\n//Costants\n//Magic methods\n    public function __call(\$name, \$arguments) {\n        return null;\n    }\n    public function __callStatic(\$name, \$arguments) {\n        return null;\n    }\n//Methods\npublic function __construct()\n{        \$rvm_pdefault = new ReturnValuesManager('pdefault');\n        FakeObjectGenerator::generate(\$rvm_pdefault, new CodeGenerator(null));\n}\n    function metodo(){\n        if(isset(self::\$times['metodo'])){\n            self::\$times['metodo']++;\n        }\n        else{\n            self::\$times['metodo'] = 1;\n        }\nswitch (self::\$times['metodo']){\n        case 1:\n        return 'primo';\n        break;\n        default:         return new pdefault();\n        }\n    }\n}";
     $this->assertEqual(FakeObjectGenerator::returnedCode(), $classe);
     $test_deault = new classe();
     $this->assertEqual($test_deault->metodo(), 'primo');
     $this->assertIsA($test_deault->metodo(), 'pdefault');
     $this->assertIsA($test_deault->metodo(), 'pdefault');
 }
 /**
  * Generates the definition of a class that has been analysed by listClassesMethodsTask
  *
  * @param mixed $arg This coukld be a string (the class' name) or a ReturnValuesManager object
  * @param string $custom_list_path optionl parameter
  * @return string eval(code of the faked class)
  */
 public static function generate($arg, CodeGenerator $codeGenerator)
 {
     self::checkInputArgs($arg, $codeGenerator);
     //$className = self::$className;
     //$returnValuesManager = self::$returnValuesManager;
     $codeGenerator->checkClassDeclared(self::$className);
     $code = "class " . self::$className;
     $code .= is_null(self::$extends) ? '' : " extends " . self::$extends;
     $code .= is_null(self::$implements) ? '' : " implements " . self::$implements;
     $code .= " {\n";
     $code .= "//timing\n ";
     $code .= "    private static \$times = array();\n";
     //inserisco le costanti se ci sono;
     $code .= "//Costants\n";
     $costants = isset(self::$classesMethods[self::$className]['costants']) ? self::$classesMethods[self::$className]['costants'] : array();
     foreach ($costants as $name => $value) {
         if (is_numeric($value)) {
             $code .= "    const " . $name . " = " . $value . ";\n";
         } else {
             if (is_bool($value)) {
                 if ($value === false) {
                     $code .= "    const " . $name . " = false;\n";
                 } else {
                     $code .= "    const " . $name . " = true;\n";
                 }
             } else {
                 $code .= "    const " . $name . " = '" . $value . "';\n";
             }
         }
     }
     //inserisco i metodi e cosa devono restituire
     $methods = self::$classesMethods[self::$className]['methods'];
     if (!is_null(self::$returnValuesManager) && !empty($methods)) {
         foreach (self::$returnValuesManager->getMethodsSet() as $method) {
             if (!in_array($method, $methods)) {
                 $methods[] = $method;
             }
         }
     } else {
         $methods = self::$returnValuesManager->getMethodsSet();
     }
     $code .= "//Magic methods\n";
     $code .= $codeGenerator->generateCodeForCallMagicMethod();
     if (!empty($methods)) {
         $code .= "//Methods\n";
         $code .= $codeGenerator->returnGenerateClassForDefault(self::$returnValuesManager);
         foreach ($methods as $name) {
             $code .= "    function " . $name . "(){\n";
             if (self::$returnValuesManager != null) {
                 //controllo se un metodo restituisce sempre la stessa cosa:
                 if (self::$returnValuesManager->hasReturnValues()) {
                     $returnValues = self::$returnValuesManager->methodReturnValues($name);
                     if (isset($returnValues['any'])) {
                         $code .= $codeGenerator->generateCodeForTimingConfiguration($name);
                         if (self::$returnValuesManager->hasInputParameter($name)) {
                             $input = self::$returnValuesManager->getInputParameter($name);
                             $code .= $codeGenerator->generateCodeForInputParameter($input, $name, 'any');
                         }
                         //inserisco i valori di input obbligatori se ci sono
                         $code .= $codeGenerator->generateMethodCode($returnValues['any'], $name);
                     } else {
                         if (!empty($returnValues)) {
                             $code .= $codeGenerator->generateCodeForTimingConfiguration($name);
                             //Ci sono più valori da restituire a seconda del momento in cui si chiama un metodo
                             $default = null;
                             $ats = array_keys($returnValues);
                             $code .= "switch (self::\$times['" . $name . "']){\n";
                             foreach ($ats as $at) {
                                 if ($at == 'default') {
                                     $default = $codeGenerator->generateReturnDefault($returnValues[$at], $name);
                                     continue;
                                 }
                                 $code .= "        case " . $at . ":\n";
                                 //inserisco i valori di input obbligatori se ci sono
                                 if (self::$returnValuesManager->hasInputParameter($name, $at)) {
                                     $input = self::$returnValuesManager->getInputParameter($methodName, $at);
                                     $code .= $codeGenerator->generateCodeForInputParameter($input, $name, $at);
                                 }
                                 $code .= $codeGenerator->generateMethodCode($returnValues[$at], $name);
                                 $code .= "        break;\n";
                             }
                             $code .= "        default: ";
                             $code .= $default != null ? $default : "return null;\n";
                             $code .= "        }\n";
                         } else {
                             //devo solo controllare che ci sia un determinato input
                             if (self::$returnValuesManager->hasInputParameter($name)) {
                                 $code .= $codeGenerator->generateCodeForTimingConfiguration($name);
                                 if ($input = self::$returnValuesManager->getInputParameter($name)) {
                                     $code .= $codeGenerator->generateCodeForInputParameter($input, $name, 'any');
                                 } else {
                                     $ats = array_keys(self::$returnValuesManager->getAllInputParameter($name));
                                     $code .= "switch (self::\$times['" . $name . "']){\n";
                                     foreach ($ats as $at) {
                                         $code .= "        case " . $at . ":\n";
                                         //inserisco i valori di input obbligatori se ci sono
                                         if ($input = self::$returnValuesManager->getInputParameter($name, $at)) {
                                             $code .= $codeGenerator->generateCodeForInputParameter($input, $name, $at);
                                         }
                                         $code .= "        return null;\n";
                                         $code .= "        break;\n";
                                     }
                                     $code .= "        default: return null;\n";
                                     $code .= "        }\n";
                                 }
                             }
                         }
                     }
                 } else {
                     $code .= "        return null;\n";
                 }
             } else {
                 $code .= "        return null;\n";
             }
             $code .= "    }\n";
         }
     }
     $code .= "}";
     //fine del codice della classe fake
     self::$returnedCode = $code;
     return eval($code);
 }
Exemplo n.º 3
0
 function test_returnJustGeneratedClassWithInputParameter_at_with_object_input()
 {
     $rvm = new ReturnValuesManager('Instance2');
     FakeObjectGenerator::generate($rvm, new CodeGenerator(null));
     $rvm = new ReturnValuesManager('test_333');
     $rvm->setInputParameterForMethod('prova_metodo', array('ciao', 'faccia', 1, 2, 3, 5, 'class:Instance2'), 2)->setInputParameterForMethod('prova_metodo', array(6, 7, 8, 'class:Instance2'), 3);
     FakeObjectGenerator::generate($rvm, new CodeGenerator(null));
     $classe = "class test_333{\n//timing\n     private static \$times = array();\n//Costants\n//Magic methods\n    public function __call(\$name, \$arguments) {\n        return null;\n    }\n    public function __callStatic(\$name, \$arguments) {\n        return null;\n    }\n//Methods\n    function prova_metodo(){\n        if(isset(self::\$times['prova_metodo'])){\n            self::\$times['prova_metodo']++;\n        }\n        else{\n            self::\$times['prova_metodo'] = 1;\n        }\nswitch (self::\$times['prova_metodo']){\n        case 2:\n        \$input = array('0'=>'ciao','1'=>'faccia','2'=>1,'3'=>2,'4'=>3,'5'=>5,'6'=>'class:Instance2');\n        \$args = func_get_args();\n        \$index = 0;\n        foreach (\$args as \$arg)\n        {\n          if(is_object(\$arg))\n          {\n            \$args[\$index] = 'class:'.get_class(\$arg);\n          }\n          \$index++;\n        }\n        \$diff = array_diff(\$input,\$args);\n        if(!empty(\$diff)){ throw new Exception(\"Invalid input parameters. [method prova_metodo] [input \".\$args.\"] [case 2]\");}\n        return null;\n        break;\n        case 3:\n        \$input = array('0'=>6,'1'=>7,'2'=>8,'3'=>'class:Instance2');\n        \$args = func_get_args();\n        \$index = 0;\n        foreach (\$args as \$arg)\n        {\n          if(is_object(\$arg))\n          {\n            \$args[\$index] = 'class:'.get_class(\$arg);\n          }\n          \$index++;\n        }\n        \$diff = array_diff(\$input,\$args);\n        if(!empty(\$diff)){ throw new Exception(\"Invalid input parameters. [method prova_metodo] [input \".\$args.\"] [case 3]\");}\n        return null;\n        break;\n        default: return null;\n        }\n    }\n}";
     $this->assertEqual($classe, FakeObjectGenerator::returnedCode());
     $oggetto = new test_333();
     $this->assertNull($oggetto->prova_metodo('ciao'));
     $this->assertNull($oggetto->prova_metodo('ciao', 'faccia', 1, 2, 3, 5, new Instance2()));
     $this->expectException('Exception');
     $oggetto->prova_metodo(new Instance2());
 }
 function test_timingConfigurationOnlyOncePerMethod_without_methods_list()
 {
     $rvm = new ReturnValuesManager('test_99');
     $rvm_array = new ReturnValuesManager('test_101');
     $rvm->setReturnObject('prova_metodo', 'test_101', 1)->setReturnObjectsArray('prova_metodo', array($rvm_array, $rvm_array), 2);
     FakeObjectGenerator::generate($rvm, new CodeGenerator(null));
     $classe = "class test_99{\n//timing\n     private static \$times = array();\n//Costants\n//Magic methods\n    public function __call(\$name, \$arguments) {\n        return null;\n    }\n    public function __callStatic(\$name, \$arguments) {\n        return null;\n    }\n//Methods\n    function prova_metodo(){\n        if(isset(self::\$times['prova_metodo'])){\n            self::\$times['prova_metodo']++;\n        }\n        else{\n            self::\$times['prova_metodo'] = 1;\n        }\nswitch (self::\$times['prova_metodo']){\n        case 1:\n        \$rvm_test_101 = new ReturnValuesManager('test_101');\n        if(self::\$times['prova_metodo'] == 1){\n        FakeObjectGenerator::generate(\$rvm_test_101, new CodeGenerator(null));\n        }\n        \$mocktest_101 = new test_101();\n        return new test_101();\n        break;\n        case 2:\n        \$rvm_test_101 = new ReturnValuesManager('test_101');\n        if(self::\$times['prova_metodo'] == 1){\n        FakeObjectGenerator::generate(\$rvm_test_101, new CodeGenerator(null));\n        }\n        \$mocktest_101 = new test_101();\n        return array(\$mocktest_101,\$mocktest_101);\n        break;\n        default: return null;\n        }\n    }\n}";
     $this->assertEqual($classe, FakeObjectGenerator::returnedCode());
     $oggetto = new test_99();
     $this->assertIsA($oggetto->prova_metodo(), test_101);
     $array = $oggetto->prova_metodo();
     $this->assertIsA($array[0], test_101);
     $this->assertIsA($array[1], test_101);
 }