public function testOutput()
    {
        $helper = new CliUserInterfaceHelper('test script', 'test.php');
        $testUsage = $helper->addUsage('Test');
        $test2Usage = $helper->addUsage('Test2');
        $loremIpsum = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam imperdiet, erat sit amet
		porttitor volutpat, enim massa vestibulum purus, nec imperdiet tortor ligula nec augue. Donec consectetur diam
		sed lacus bibendum dictum. Aenean luctus, est eget vestibulum aliquam, mauris nisi vehicula orci, eget aliquam
		tellus lorem in nisl. Curabitur felis est, imperdiet a molestie in, aliquet eget metus. Cras pretium accumsan
		augue vel euismod.';
        $helper->addSwitch('a', 'test', $loremIpsum, $testUsage, true, 'test', true);
        $helper->addSwitch('b', null, 'Test 2', null);
        $helper->addSwitch(null, 'test3', 'Test 3', $test2Usage, false);
        $helper->addSwitch('d', 'test4', 'Test 4', array($testUsage, $test2Usage), true, 'test4');
        $expectedOutput = 'Usages:

    Test:
        test.php  -b  [-a[=<test>]|--test[=<test>]]
        [-d=<test4>|--test4=<test4>]

    Test2:
        test.php  -b  --test3  [-d=<test4>|--test4=<test4>]



test script

  -a, --test    Lorem ipsum dolor sit amet, consectetur adipiscing elit.
                Etiam imperdiet, erat sit amet porttitor volutpat, enim
                massa vestibulum purus, nec imperdiet tortor ligula nec
                augue. Donec consectetur diam sed lacus bibendum dictum.
                Aenean luctus, est eget vestibulum aliquam, mauris nisi
                vehicula orci, eget aliquam tellus lorem in nisl. Curabitur
                felis est, imperdiet a molestie in, aliquet eget metus.
                Cras pretium accumsan augue vel euismod.
  -b            Test 2
      --test3   Test 3
  -d, --test4   Test 4


';
        $this->assertSame($expectedOutput, $helper->getUsageOutput(true));
        $helper->setErrorMessage('Test error');
        $expectedOutput = 'Error:
    Test error


Usages:

    Test:
        test.php  -b  [-a[=<test>]|--test[=<test>]]
        [-d=<test4>|--test4=<test4>]

    Test2:
        test.php  -b  --test3  [-d=<test4>|--test4=<test4>]

';
        $this->assertSame($expectedOutput, $helper->getUsageOutput(false));
    }
 /**
  * Starts script execution.
  *
  * @return void
  *
  * @throws \Exception   On errors
  */
 public function run()
 {
     $this->setAsTerminator();
     $eventHandlerRegistry = Application::getInstance()->getDiContainer()->getEventHandlerRegistry();
     $eventHandlerRegistry->raise(new Event(Event::TYPE_APPLICATION_BEFORE_RUN));
     $this->prepareSwitches();
     try {
         $this->parseSwitches($this->cliHelper->getParsedArgs());
     } catch (\Exception $exception) {
         $this->cliHelper->setErrorMessage($exception->getMessage());
         // Set the exit code to invocation error if it's currently set to success.
         if ($this->getExitCode() == self::EXIT_CODE_SUCCESS) {
             $this->setExitCode(self::EXIT_CODE_INVOCATION_ERROR);
         }
         echo $this->cliHelper->getUsageOutput(false);
         // Re-throw the exception
         throw $exception;
     }
     $this->runBefore();
     try {
         if ($this->currentUsage == self::HELP_USAGE) {
             echo $this->cliHelper->getUsageOutput(true);
         } else {
             $eventHandlerRegistry->raise(new Event(Event::TYPE_CONTROLLER_BEFORE_ACTION));
             $this->execute();
             $eventHandlerRegistry->raise(new Event(Event::TYPE_CONTROLLER_AFTER_ACTION));
         }
     } catch (\Exception $exception) {
         $this->removeSignalHandler();
         if (self::EXIT_CODE_SUCCESS == $this->getExitCode()) {
             $this->setExitCode(self::EXIT_CODE_UNHANDLED_EXCEPTION);
         }
         Application::getInstance()->getDiContainer()->getErrorHandlerRegistry()->handleException($exception);
     }
     $this->removeSignalHandler();
     $this->runAfter();
     $eventHandlerRegistry->raise(new Event(Event::TYPE_APPLICATION_AFTER_RUN));
 }