<?php
/**
 * @copyright (c) Kufer Software GmbH, Oderstraße 7, D-84453 Mühldorf
 */

/**
 * Generated by PHPUnit_SkeletonGenerator on 2017-03-03 at 10:00:22.
 */
class ExportCalculationTest extends \PHPUnit\Framework\TestCase
{
  /**
   * @var CleanOperations
   */
  protected $object;

  private $checked;

  /**
   * Sets up the fixture, for example, opens a network connection.
   * This method is called before a test is executed.
   */
  protected function setUp(): void
  {
    $this->object = new ExportCalculation();
    $this->checked = HTMLOperations::getEmptyAttribute('checked');
  }

  /**
   * Tears down the fixture, for example, closes a network connection.
   * This method is called after a test is executed.
   */
  protected function tearDown(): void
  {
  }

  /**
   * @covers ExportCalculation::getVarValue4System()
   * @test
   */
  public function getVarValue4System_katid()
  {
    $_GET['katid'] = '5';
    $_REQUEST['urlparameter'] = 'katid:5;';
    $this->assertEquals(5, $this->object->getVarValue4System('katid'));
    $_GET['katid'] = 'bla';
    $_REQUEST['urlparameter'] = 'katid:bla';
    $this->assertEquals(0, $this->object->getVarValue4System('katid'));
    $_GET['katid'] = '';
    $_REQUEST['urlparameter'] = 'bla';
    $this->assertEquals(0, $this->object->getVarValue4System('katid'));
  }

  /**
   * @covers ExportCalculation::getVarValue4System()
   * @test
   */
  public function getVarValue4System_katvaterid()
  {
    $_GET['katvaterid'] = '5';
    $_REQUEST['urlparameter'] = 'katvaterid:5;';
    $this->assertEquals('5', $this->object->getVarValue4System('katvaterid'));
    $_GET['katvaterid'] = 'bla';
    $_REQUEST['urlparameter'] = 'katvaterid:bla';
    $this->assertEquals(0, $this->object->getVarValue4System('katvaterid'));
    $_GET['katvaterid'] = '';
    $_REQUEST['urlparameter'] = 'bla';
    $this->assertEquals(0, $this->object->getVarValue4System('katvaterid'));
  }

  /**
   * @covers ExportCalculation::getVarValue4Kurs()
   * @test
   */
  public function getVarValue4Kurs_beginn_dat_wotagkurz_withAbbr()
  {
    $kurs = new Kurs();
    $kurs->setValue2Var('beginn_dat', '18.12.2020'); // Freitag
    $this->object->settingsTool4->removeAbbr = false;
    $expected = '<abbr title="Freitag">Fr.</abbr>';
    $this->assertEquals($expected, $this->object->getVarValue4Kurs('beginn_dat_wotagkurz', $kurs));
  }

  /**
   * @covers ExportCalculation::getVarValue4Kurs()
   * @test
   */
  public function getVarValue4Kurs_beginn_dat_wotagkurz_withoutAbbr()
  {
    $kurs = new Kurs();
    $kurs->setValue2Var('beginn_dat', '18.12.2020'); // Freitag
    $this->object->settingsTool4->removeAbbr = true;
    $expected = 'Fr.';
    $this->assertEquals($expected, $this->object->getVarValue4Kurs('beginn_dat_wotagkurz', $kurs));
  }

  /**
   * @covers ExportCalculation::getVarValue4Kurs()
   * @test
   */
  public function getVarValue4Kurs_ende_dat_wotagkurz_withAbbr()
  {
    $kurs = new Kurs();
    $kurs->setValue2Var('ende_dat', '18.12.2020'); // Freitag
    $this->object->settingsTool4->removeAbbr = false;
    $expected = '<abbr title="Freitag">Fr.</abbr>';
    $this->assertEquals($expected, $this->object->getVarValue4Kurs('ende_dat_wotagkurz', $kurs));
  }

  /**
   * @covers ExportCalculation::getVarValue4Kurs()
   * @test
   */
  public function getVarValue4Kurs_ende_dat_wotagkurz_withoutAbbr()
  {
    $kurs = new Kurs();
    $kurs->setValue2Var('ende_dat', '18.12.2020'); // Freitag
    $this->object->settingsTool4->removeAbbr = true;
    $expected = 'Fr.';
    $this->assertEquals($expected, $this->object->getVarValue4Kurs('ende_dat_wotagkurz', $kurs));
  }

  /**
   * @covers ExportCalculation::getVarValue4Kurstag()
   * @test
   */
  public function getVarValue4Kurstag_wotagkurz_withoutAbbr()
  {
    $dm = new Kurstag();
    $dm->setValue2Var('datum', '12.11.2021');
    $dm->setValue2Var('wotagkurz', 'Fr.');
    $this->object->settingsTool4->removeAbbr = true;
    $this->assertEquals('Fr.', $this->object->getVarValue4Kurstag('wotagkurz', $dm));
  }

  /**
   * @covers ExportCalculation::getVarValue4Kurstag()
   * @test
   */
  public function getVarValue4Kurstag_wotagkurz_withAbbr()
  {
    $dm = new Kurstag();
    $dm->setValue2Var('datum', '12.11.2021');
    $dm->setValue2Var('wotagkurz', 'Fr.');
    $this->object->settingsTool4->removeAbbr = false;
    $expected = '<abbr title="Freitag">Fr.</abbr>';
    $this->assertEquals($expected, $this->object->getVarValue4Kurstag('wotagkurz', $dm));
  }

  /**
   * @covers ExportCalculation::getVarValue4Kurs()
   * @test
   */
  public function getVarValue4Kurs_kursbeginn_dat_wotagkurz_KeinKursbeginnEmptyWithoutAbbr()
  {
    $kurs = new Kurs();
    $kurs->setValue2Var('beginn_dat', '18.12.2020'); // Freitag
    $kurs->setValue2Var('keinkursbeginn', '');
    $this->object->settingsTool4->removeAbbr = true;
    $expected = 'Fr.';
    $this->assertEquals($expected, $this->object->getVarValue4Kurs('kursbeginn_dat_wotagkurz', $kurs));
  }

  /**
   * @covers ExportCalculation::getVarValue4Kurs()
   * @test
   */
  public function getVarValue4Kurs_kursbeginn_dat_wotagkurz_KeinKursbeginnEmptyWithAbbr()
  {
    $kurs = new Kurs();
    $kurs->setValue2Var('beginn_dat', '18.12.2020'); // Freitag
    $kurs->setValue2Var('keinkursbeginn', '');
    $this->object->settingsTool4->removeAbbr = false;
    $expected = '<abbr title="Freitag">Fr.</abbr>';
    $this->assertEquals($expected, $this->object->getVarValue4Kurs('kursbeginn_dat_wotagkurz', $kurs));
  }

  /**
   * @covers ExportCalculation::getVarValue4Kurs()
   * @test
   */
  public function getVarValue4Kurs_kursbeginn_dat_wotagkurz_KeinKursbeginnGefuelltReturnsEmptyString()
  {
    $kurs = new Kurs();
    $kurs->setValue2Var('beginn_dat_wotagkurz', 'Fr.');
    $kurs->setValue2Var('keinkursbeginn', 'Beginn am');
    $this->object->settingsTool4->removeAbbr = true;
    $expected = '';
    $this->assertEquals($expected, $this->object->getVarValue4Kurs('kursbeginn_dat_wotagkurz', $kurs));
  }

  /**
   * @covers ExportCalculation::getVarValue4Kurs()
   * @test
   */
  public function getVarValue4Kurs_kurzbez_ohne_ausfall()
  {
    $kurs = new Kurs();
    $kurs->setValue2Var('kurzbez', 'Ausfall: Volle Möhre');
    $expected = 'Volle M&ouml;hre';
    $this->assertEquals($expected, $this->object->getVarValue4Kurs('kurzbez_ohne_ausfall', $kurs));
    $kurs2 = new Kurs();
    $kurs2->setValue2Var('kurzbez', 'Ausfall:Volle Möhre');
    $this->assertEquals($expected, $this->object->getVarValue4Kurs('kurzbez_ohne_ausfall', $kurs2));

    $expected3 = 'Titel, der nicht mit Ausfall beginnt';
    $kurs3 = new Kurs();
    $kurs3->setValue2Var('kurzbez', $expected3);
    $this->assertEquals($expected3, $this->object->getVarValue4Kurs('kurzbez_ohne_ausfall', $kurs3));
  }

  /**
   * @covers ExportCalculation::getVarValue4SightButtons()
   * @test
   */
  public function getVarValue4SightButtons_wizzardanmart()
  {
    $varname = 'wizzardanmartnormal';
    $expected = 'index.php?urlparameter=kathaupt%3A5%3Banmart%3A1%3B';
    $this->assertEquals($expected, $this->object->getVarValue4SightButtons($varname), $varname);
    $varname = 'wizzardanmartelternkind';
    $expected = 'index.php?urlparameter=kathaupt%3A5%3Banmart%3A3%3B';
    $this->assertEquals($expected, $this->object->getVarValue4SightButtons($varname), $varname);
    $varname = 'wizzardanmartfirma';
    $expected = 'index.php?urlparameter=kathaupt%3A5%3Banmart%3A2%3B';
    $this->assertEquals($expected, $this->object->getVarValue4SightButtons($varname), $varname);
    $varname = 'wizzardanmartpaar';
    $expected = 'index.php?urlparameter=kathaupt%3A5%3Banmart%3A4%3B';
    $this->assertEquals($expected, $this->object->getVarValue4SightButtons($varname), $varname);
    $varname = 'wizzardanmartmehrfach';
    $expected = 'index.php?urlparameter=kathaupt%3A5%3Banmart%3A5%3B';
    $this->assertEquals($expected, $this->object->getVarValue4SightButtons($varname), $varname);
    $varname = 'wizzardanmartnormalfirma';
    $expected = 'index.php?urlparameter=kathaupt%3A5%3Banmart%3A10%3B';
    $this->assertEquals($expected, $this->object->getVarValue4SightButtons($varname), $varname);
  }

  /**
   * @covers ExportCalculation::getVarValue4TeilnehmerEdit()
   * @test
   */
  public function getVarValue4TeilnehmerEdit_kw_anm_normal_firma()
  {
    $tmp = SessionOperations::getVarValueAnm(ANMELDEART);
    $varname = 'kw_anm_normal_firma';
    //Test nicht vorbelegt
    SessionOperations::setVarValueAnm(ANMELDEART, '');
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', $varname);
    $this->assertHtmlAttribute($res, 'type', 'checkbox');
    $this->assertHtmlAttribute($res, 'id', 'kw_anm_nf_id');
    $this->assertHtmlAttribute($res, 'value', '1');
    $this->assertStringNotContainsString('checked', $res, 'Output is checked but shouldn\'t be');
    //Test vorbelegt
    SessionOperations::setVarValueAnm(ANMELDEART, ANMELDEART_INTERN_FIRMA);
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertStringContainsString('checked', $res, 'Output is not checked but should be');

    //Session wiederherstellen
    SessionOperations::setVarValueAnm(ANMELDEART, $tmp);
  }

  /**
   * @covers ExportCalculation::getVarValue4TeilnehmerEdit()
   * @test
   */
  public function getVarValue4TeilnehmerEdit_emailWithDescription()
  {
    $varname = 'email:myMail';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    // Auskommentiert, da dieser Test fehlt schlägt, wenn nicht das neue Anmeldeverfahren verwendet wird. Wie im Kommentar der zweiten Zeile erklärt, ist dieser Test nicht zwingend nötig.
    //$exp = '<input name="tedit_email" type="text" id="tedit_emailid" class="tedit tedit_emailclass form-control" maxlength="100" />';
    //$this->assertEquals($exp, $res, 'TN Edit - EMail');//exakte Gleichheit, kann eigtl. zugunsten der nächsten Testfälle vernachlässigt werden:
    $this->assertHtmlAttribute($res, 'name', 'tedit_email');
    $this->assertHtmlAttribute($res, 'type', 'email');
    $this->assertHtmlAttribute($res, 'id', 'tedit_emailid');
    $this->assertHtmlAttribute($res, 'maxlength', '100');
    //Nebeneffekt testen: der Name für den Versand in der Mail wird auch hier gesetzt
    $this->assertEquals('myMail', SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'email', 'E-Mail'));

    //mit Vorbelegung => Vorbelegung darf nicht genommen werden
    $varname = 'email:myMail:_:nameInSQL';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertEquals('myMail', SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'email', 'E-Mail'));

    //Name enthält HTML Tags => Tags dürfen nicht in Session/Anmeldung übernommen werden
    $varname = 'email:<span class="blue">eMail</span>';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertEquals('eMail', SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'email', 'E-Mail'));
  }

  /**
   * @param string $pResult zu testender String
   * @param string $pAttr Name des Attributs
   * @param string $pValue (Teil-) Wert des Attributs; Teilwert, wenn für $pStrict false übergeben wird.
   * @param boolean $pStrict damit wird erreicht, dass man z.B. einzelne Bestandteile einer CSS Klasse abfragen kann und nicht alles wissen/angeben muss
   */
  private function assertHtmlAttribute($pResult, $pAttr, $pValue = '', $pStrict = true)
  {
    //disabled="disabled" nur bei CONTENTTYPE XHTML abprüfen, ansonsten reicht disabled
    if (CONTENTTYPE !== 'XHTML' && $pAttr === $pValue) {
      $pValue = '';
    }
    if (!$pStrict) {
      $rest = '[^\'"]*';
    } else {
      $rest = '';
    }
    $mustContain = '/' . $pAttr . ($pValue !== '' ? '=[\'"]' . $rest . $pValue . $rest . '[\'"]' : '') . '/';
    $this->assertMatchesRegularExpression($mustContain, $pResult, 'html attribute "' . $pAttr . '" not correct');
  }

  private function assertSelectOption($pResult, $pText, $pValue = '')
  {
    $mustContain = $this->assertSelectOptionPattern($pText, $pValue);
    $this->assertStringContainsString($mustContain, $pResult, 'option not correct: ' . $pText);
  }

  private function assertSelectOptionPattern($pText, $pValue = '')
  {
    return '<option value="' . $pValue . '">' . $pText . '</option>';
  }

  private function assertNotSelectOption($pResult, $pText, $pValue = '')
  {
    $mustContain = $this->assertSelectOptionPattern($pText, $pValue);
    $x = strpos($pResult, $mustContain);
    $this->assertTrue($x === false, 'option too much: ' . $pResult . ' should not contain ' . $mustContain);
  }

  private function assertSelectOption2($pResult, $pText, $pValue = '')
  {
    $pattern = '/<option[ ]+(selected="selected" )?value=[\'"]' . $pValue . '[\'"]>' . $pText . '/';
    $this->assertMatchesRegularExpression($pattern, $pResult, $pText . ' option not correct');
  }

  private function assertPflichtfeld($pResult, $pVarname, $pValue = '')
  {
    $this->assertHtmlAttribute($pResult, 'name', 'tedit_' . $pVarname . '_pflichtfeld');
    $this->assertHtmlAttribute($pResult, 'type', 'hidden');
    $this->assertHtmlAttribute($pResult, 'class', 'tedit tedit_' . $pVarname . '_pflichtfeldclass', false);
    $this->assertHtmlAttribute($pResult, 'value', $pValue);
  }

  /**
   * @covers ExportCalculation::getGeschlechtRadioButton()
   * @test
   */
  public function getGeschlechtRadioButtonM()
  {
    $this->object->isDataBinding = true;//die expected values beziehen sich auf die neue Anmeldung
    $geschlecht = 'm';
    $value = '';
    $person = '';
    $bootstrap = true;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class=" tedit_geschlechtlabelclassM radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidM" class="tedit tedit_geschlechtclassM" value="M" data-bind="checked: hauptTn().geschlecht"' . CLOSE_TAG . ' M</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');

    //Radiobutton vorausgefüllt, wenn Wert = M
    $value = 'M';
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class=" tedit_geschlechtlabelclassM radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidM" class="tedit tedit_geschlechtclassM" value="M" ' . $this->checked . ' data-bind="checked: hauptTn().geschlecht"' . CLOSE_TAG . ' M</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');
    //ohne Bootstrap Klasse
    $value = '';
    $bootstrap = false;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class=" tedit_geschlechtlabelclassM " >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidM" class="tedit tedit_geschlechtclassM" value="M" data-bind="checked: hauptTn().geschlecht"' . CLOSE_TAG . ' M</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');
    //für weitere Person:
    $bootstrap = false;
    $person = 'mehr';
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class=" teditmehr_geschlechtlabelclassM " >' . "\n"
              . '<input name="teditmehr_geschlecht" type="radio" id="teditmehr_geschlechtidM" class="teditmehr teditmehr_geschlechtclassM" value="M" data-bind="checked: geradeEditierterWeitererTn().geschlecht"' . CLOSE_TAG . ' M</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');

    //Test für den Parameter Bezeichnung
    $value = '';
    $person = '';
    $bootstrap = true;
    $bezeichnung = 'Hätten Sie mit dieser Bezeichnung gerechnet?';
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" tedit_geschlechtlabelclassM radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidM" class="tedit tedit_geschlechtclassM" value="M" data-bind="checked: hauptTn().geschlecht"' . CLOSE_TAG . ' ' . $bezeichnung . '</label>';
    $this->assertEquals($expected, $result, 'getGeschlechtRadioButton - m Test des Parameters Bezeichnung');
  }

  /**
   * @covers ExportCalculation::getGeschlechtRadioButton()
   * @test
   */
  public function getGeschlechtRadioButtonI()
  {
    $this->object->isDataBinding = true;

    $geschlecht = 'i';
    $bezeichnung = 'inter';
    $value = '';
    $person = '';
    $bootstrap = true;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" tedit_geschlechtlabelclassI radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidI" class="tedit tedit_geschlechtclassI" value="I" data-bind="checked: hauptTn().geschlecht"' . CLOSE_TAG . ' inter</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');

    //gewählt
    $value = 'I';
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" tedit_geschlechtlabelclassI radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidI" class="tedit tedit_geschlechtclassI" value="I" ' . $this->checked . ' data-bind="checked: hauptTn().geschlecht"' . CLOSE_TAG . ' inter</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');

    //nicht gewählt, ohne Bootstrap
    $value = '';
    $bootstrap = false;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" tedit_geschlechtlabelclassI " >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidI" class="tedit tedit_geschlechtclassI" value="I" data-bind="checked: hauptTn().geschlecht"' . CLOSE_TAG . ' inter</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');

    //für weitere Person
    $person = 'mehr';
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" teditmehr_geschlechtlabelclassI " >' . "\n"
              . '<input name="teditmehr_geschlecht" type="radio" id="teditmehr_geschlechtidI" class="teditmehr teditmehr_geschlechtclassI" value="I" data-bind="checked: geradeEditierterWeitererTn().geschlecht"' . CLOSE_TAG . ' inter</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');

    //ohne Bezeichnung
    $value = '';
    $person = '';
    $bootstrap = true;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class="radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidI" class="tedit tedit_geschlechtclassI" value="I" data-bind="checked: hauptTn().geschlecht"' . CLOSE_TAG . ' i</label>';
//      $this->assertEquals($expected, $result, 'getGeschlechtRadioButton - inter - Standard - ohne Bezeichnung');
  }

  /**
   * @covers ExportCalculation::getGeschlechtRadioButton()
   * @test
   */
  public function getGeschlechtRadioButtonD()
  {
    $this->object->isDataBinding = true;

    $geschlecht = 'd';
    $bezeichnung = 'divers';
    $value = '';
    $person = '';
    $bootstrap = true;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" tedit_geschlechtlabelclassD radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidD" class="tedit tedit_geschlechtclassD" value="D" data-bind="checked: hauptTn().geschlecht"' . CLOSE_TAG . ' divers</label>';
    $this->assertEquals($expected, $result, 'getGeschlechtRadioButton - divers - standard mit bootstrap');

    //gewählt
    $value = 'D';
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" tedit_geschlechtlabelclassD radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidD" class="tedit tedit_geschlechtclassD" value="D" ' . $this->checked . ' data-bind="checked: hauptTn().geschlecht"' . CLOSE_TAG . ' divers</label>';
    $this->assertEquals($expected, $result, 'getGeschlechtRadioButton - divers - gewählt mit bootstrap');

    //nicht gewählt, ohne Bootstrap
    $value = '';
    $bootstrap = false;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" tedit_geschlechtlabelclassD " >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidD" class="tedit tedit_geschlechtclassD" value="D" data-bind="checked: hauptTn().geschlecht"' . CLOSE_TAG . ' divers</label>';
    $this->assertEquals($expected, $result, 'getGeschlechtRadioButton - divers - standard ohne bootstrap');

    //für weitere Person
    $person = 'mehr';
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" teditmehr_geschlechtlabelclassD " >' . "\n"
              . '<input name="teditmehr_geschlecht" type="radio" id="teditmehr_geschlechtidD" class="teditmehr teditmehr_geschlechtclassD" value="D" data-bind="checked: geradeEditierterWeitererTn().geschlecht"' . CLOSE_TAG . ' divers</label>';
    $this->assertEquals($expected, $result, 'getGeschlechtRadioButton - divers - mehr ohne bootstrap');

    //ohne Bezeichnung
    $value = '';
    $person = '';
    $bootstrap = true;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class="radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidD" class="tedit tedit_geschlechtclassD" value="D" data-bind="checked: hauptTn().geschlecht"' . CLOSE_TAG . ' d</label>';
//      $this->assertEquals($expected, $result, 'getGeschlechtRadioButton - inter - Standard - ohne Bezeichnung');
  }

  /**
   * @covers ExportCalculation::getGeschlechtRadioButton()
   * @test
   */
  public function getGeschlechtRadioButtonM_AlteAnm()
  {
    $this->object->isDataBinding = false;//die expected values beziehen sich auf die alte Anmeldung
    $geschlecht = 'm';
    $value = '';
    $person = '';
    $bootstrap = true;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class=" tedit_geschlechtlabelclassM radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidM" class="tedit tedit_geschlechtclassM" value="M"' . CLOSE_TAG . ' M</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');
    //Radiobutton vorausgefüllt, wenn Wert = M
    $value = 'M';
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class=" tedit_geschlechtlabelclassM radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidM" class="tedit tedit_geschlechtclassM" value="M" ' . $this->checked . '' . CLOSE_TAG . ' M</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');
    //ohne Bootstrap Klasse
    $value = '';
    $bootstrap = false;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class=" tedit_geschlechtlabelclassM " >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidM" class="tedit tedit_geschlechtclassM" value="M"' . CLOSE_TAG . ' M</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');
    //für weitere Person:
    $bootstrap = false;
    $person = 'mehr';
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class=" teditmehr_geschlechtlabelclassM " >' . "\n"
              . '<input name="teditmehr_geschlecht" type="radio" id="teditmehr_geschlechtidM" class="teditmehr teditmehr_geschlechtclassM" value="M"' . CLOSE_TAG . ' M</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');
  }

  /**
   * @covers ExportCalculation::getGeschlechtRadioButton()
   * @test
   */
  public function getGeschlechtRadioButtonD_AlteAnm()
  {
    $this->object->isDataBinding = false;//die expected values beziehen sich auf die alte Anmeldung
    $geschlecht = 'd';
    $value = '';
    $person = '';
    $bootstrap = true;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class=" tedit_geschlechtlabelclassD radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidD" class="tedit tedit_geschlechtclassD" value="D"' . CLOSE_TAG . ' D</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');

    $geschlecht = 'd';
    $bezeichnung = 'divers';
    $value = '';
    $person = '';
    $bootstrap = true;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" tedit_geschlechtlabelclassD radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidD" class="tedit tedit_geschlechtclassD" value="D"' . CLOSE_TAG . ' divers</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');

    //Radiobutton vorausgefüllt, wenn Wert = M
    $value = 'D';
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" tedit_geschlechtlabelclassD radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidD" class="tedit tedit_geschlechtclassD" value="D" ' . $this->checked . '' . CLOSE_TAG . ' divers</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');
    //ohne Bootstrap Klasse
    $value = '';
    $bootstrap = false;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" tedit_geschlechtlabelclassD " >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidD" class="tedit tedit_geschlechtclassD" value="D"' . CLOSE_TAG . ' divers</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');
    //für weitere Person:
    $bootstrap = false;
    $person = 'mehr';
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" teditmehr_geschlechtlabelclassD " >' . "\n"
              . '<input name="teditmehr_geschlecht" type="radio" id="teditmehr_geschlechtidD" class="teditmehr teditmehr_geschlechtclassD" value="D"' . CLOSE_TAG . ' divers</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');
  }

  /**
   * @covers ExportCalculation::getGeschlechtRadioButton()
   * @test
   */
  public function getGeschlechtRadioButtonI_AlteAnm()
  {
    $this->object->isDataBinding = false;//die expected values beziehen sich auf die alte Anmeldung
    $geschlecht = 'i';
    $value = '';
    $person = '';
    $bootstrap = true;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class=" tedit_geschlechtlabelclassI radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidI" class="tedit tedit_geschlechtclassI" value="I"' . CLOSE_TAG . ' I</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');

    $geschlecht = 'i';
    $bezeichnung = 'inter';
    $value = '';
    $person = '';
    $bootstrap = true;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" tedit_geschlechtlabelclassI radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidI" class="tedit tedit_geschlechtclassI" value="I"' . CLOSE_TAG . ' inter</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');

    //Radiobutton vorausgefüllt, wenn Wert = M
    $value = 'I';
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" tedit_geschlechtlabelclassI radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidI" class="tedit tedit_geschlechtclassI" value="I" ' . $this->checked . '' . CLOSE_TAG . ' inter</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');
    //ohne Bootstrap Klasse
    $value = '';
    $bootstrap = false;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" tedit_geschlechtlabelclassI " >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidI" class="tedit tedit_geschlechtclassI" value="I"' . CLOSE_TAG . ' inter</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');
    //für weitere Person:
    $bootstrap = false;
    $person = 'mehr';
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap, $bezeichnung);
    $expected = '<label class=" teditmehr_geschlechtlabelclassI " >' . "\n"
              . '<input name="teditmehr_geschlecht" type="radio" id="teditmehr_geschlechtidI" class="teditmehr teditmehr_geschlechtclassI" value="I"' . CLOSE_TAG . ' inter</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');
  }

  /**
   * @covers ExportCalculation::getGeschlechtRadioButton()
   * @test
   */
  public function getGeschlechtRadioButtonF()
  {
    $this->object->isDataBinding = true;//die expected values beziehen sich auf die neue Anmeldung
    $geschlecht = 'F';
    $value = '';
    $person = '';
    $bootstrap = true;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class=" tedit_geschlechtlabelclassF radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidF" class="tedit tedit_geschlechtclassF" value="F" data-bind="checked: hauptTn().geschlecht"' . CLOSE_TAG . ' Firma</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');
    $bootstrap = false;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class=" tedit_geschlechtlabelclassF " >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidF" class="tedit tedit_geschlechtclassF" value="F" data-bind="checked: hauptTn().geschlecht"' . CLOSE_TAG . ' Firma</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');

    $bootstrap = false;
    $person = 'mehr';
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class=" teditmehr_geschlechtlabelclassF " >' . "\n"
              . '<input name="teditmehr_geschlecht" type="radio" id="teditmehr_geschlechtidF" class="teditmehr teditmehr_geschlechtclassF" value="F" data-bind="checked: geradeEditierterWeitererTn().geschlecht"' . CLOSE_TAG . ' Firma</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');
  }

  /**
   * @covers ExportCalculation::getGeschlechtRadioButton()
   * @test
   */
  public function getGeschlechtRadioButtonF_AlteAnm()
  {
    $this->object->isDataBinding = false;//die expected values beziehen sich auf die alte Anmeldung
    $geschlecht = 'F';
    $value = '';
    $person = '';
    $bootstrap = true;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class=" tedit_geschlechtlabelclassF radio-inline" >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidF" class="tedit tedit_geschlechtclassF" value="F"' . CLOSE_TAG . ' Firma</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');
    $bootstrap = false;
    $result = $this->object->getGeschlechtRadioButton($geschlecht, $value, $person, $bootstrap);
    $expected = '<label class=" tedit_geschlechtlabelclassF " >' . "\n"
              . '<input name="tedit_geschlecht" type="radio" id="tedit_geschlechtidF" class="tedit tedit_geschlechtclassF" value="F"' . CLOSE_TAG . ' Firma</label>';
    $this->assertEquals($expected, $result, 'meine Meldung');
  }

  /**
   * @covers ExportCalculation::getVarValue4TeilnehmerEdit()
   * @test
   */
  public function getVarValue4TeilnehmerEdit_geschlecht_mw_AlteAnm()
  {
    $this->object->isDataBinding = false;
    $varname = 'geschlecht_mw';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht');
    $this->assertHtmlAttribute($res, 'id', 'tedit_geschlechtid');
    $this->assertHtmlAttribute($res, 'size', '1');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlechtclass', false);
    $this->assertSelectOption($res, 'W - Weiblich', 'W');
    $this->assertSelectOption($res, 'M - Männlich', 'M');
    $this->assertNotSelectOption($res, 'Bitte w&auml;hlen', '');

    //Mit Pflichtfeld:
    $varname = 'geschlecht_mw_pflichtfeld:Geschlecht';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht');
    $this->assertHtmlAttribute($res, 'id', 'tedit_geschlechtid');
    $this->assertHtmlAttribute($res, 'size', '1');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlechtclass', false);
    $this->assertSelectOption($res, 'W - Weiblich', 'W');
    $this->assertSelectOption($res, 'M - Männlich', 'M');
    $this->assertNotSelectOption($res, 'Bitte w&auml;hlen', '');
    //Hidden Input
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht_pflichtfeld');
    $this->assertHtmlAttribute($res, 'type', 'hidden');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlecht_pflichtfeldclass', false);
    $this->assertHtmlAttribute($res, 'value', 'Geschlecht');


    $varname = 'geschlecht_mw_eng';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht');
    $this->assertHtmlAttribute($res, 'id', 'tedit_geschlechtid');
    $this->assertHtmlAttribute($res, 'size', '1');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlechtclass', false);
    $this->assertSelectOption($res, 'W - Weiblich/female', 'W');
    $this->assertSelectOption($res, 'M - Männlich/male', 'M');
    $this->assertNotSelectOption($res, 'Bitte w&auml;hlen', '');

    $varname = 'geschlecht_mw_eng_readonly';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht');
    $this->assertHtmlAttribute($res, 'id', 'tedit_geschlechtid');
    $this->assertHtmlAttribute($res, 'size', '1');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlechtclass', false);
    $this->assertHtmlAttribute($res, 'disabled', 'disabled');
    $this->assertSelectOption($res, 'W - Weiblich/female', 'W');
    $this->assertSelectOption($res, 'M - Männlich/male', 'M');
    $this->assertNotSelectOption($res, 'Bitte w&auml;hlen', '');

    $varname = 'geschlecht_mw_def';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht');
    $this->assertHtmlAttribute($res, 'id', 'tedit_geschlechtid');
    $this->assertHtmlAttribute($res, 'size', '1');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlechtclass', false);
    $this->assertSelectOption($res, 'W - Weiblich', 'W');
    $this->assertSelectOption($res, 'M - Männlich', 'M');
    $pattern = '!<option value="" selected(="selected")?>Bitte w&auml;hlen</option>!';
    $this->assertMatchesRegularExpression($pattern, $res, 'option not correct: Bitte w&auml;hlen');


    $varname = 'geschlecht_mw_def_readonly';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht');
    $this->assertHtmlAttribute($res, 'id', 'tedit_geschlechtid');
    $this->assertHtmlAttribute($res, 'size', '1');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlechtclass', false);
    $this->assertHtmlAttribute($res, 'disabled', 'disabled');
    $this->assertSelectOption($res, 'W - Weiblich', 'W');
    $this->assertSelectOption($res, 'M - Männlich', 'M');
    $pattern = '!<option value="" selected(="selected")?>Bitte w&auml;hlen</option>!';
    $this->assertMatchesRegularExpression($pattern, $res, 'option not correct: Bitte w&auml;hlen');
  }

  /**
   * @covers ExportCalculation::getVarValue4TeilnehmerEdit()
   * @test
   */
  public function getVarValue4TeilnehmerEdit_withDataBinding_geschlecht_mw()
  {
    $this->object->isDataBinding = true;
    $varname = 'geschlecht_mw';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht');
    $this->assertHtmlAttribute($res, 'id', 'tedit_geschlechtid');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlechtclass[ ]?', false);
    $this->assertHtmlAttribute($res, 'data-bind', 'options: \\[{ wert: [\'"]W[\'"], bezeichnung: [\'"]W - Weiblich[\'"]},{ wert: [\'"]M[\'"], bezeichnung: [\'"]M - M&auml;nnlich[\'"]}\\], value:hauptTn\\(\\).geschlecht, optionsText: \'bezeichnung\', optionsValue: \'wert\'');

    //Mit Pflichtfeld:
    $varname = 'geschlecht_mw_pflichtfeld:Geschlecht';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht');
    $this->assertHtmlAttribute($res, 'id', 'tedit_geschlechtid');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlechtclass[ ]?', false);
    $this->assertHtmlAttribute($res, 'data-bind', 'options: \\[{ wert: [\'"]W[\'"], bezeichnung: [\'"]W - Weiblich[\'"]},{ wert: [\'"]M[\'"], bezeichnung: [\'"]M - M&auml;nnlich[\'"]}\\], value:hauptTn\\(\\).geschlecht, optionsText: \'bezeichnung\', optionsValue: \'wert\'');

    $varname = 'geschlecht_mw_readonly';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht');
    $this->assertHtmlAttribute($res, 'id', 'tedit_geschlechtid');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlechtclass[ ]?', false);
    $this->assertHtmlAttribute($res, 'data-bind', 'options: \\[{ wert: [\'"]W[\'"], bezeichnung: [\'"]W - Weiblich[\'"]},{ wert: [\'"]M[\'"], bezeichnung: [\'"]M - M&auml;nnlich[\'"]}\\], value:hauptTn\\(\\).geschlecht, optionsText: \'bezeichnung\', optionsValue: \'wert\', disable: true');
  }

  /**
   * @covers ExportCalculation::getVarValue4TeilnehmerEdit()
   * @test
   */
  public function getVarValue4TeilnehmerEdit_withoutDataBinding_geschlecht_mw_anrede()
  {
    $this->object->isDataBinding = false;
    $varname = 'geschlecht_mw_anrede';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht');
    $this->assertHtmlAttribute($res, 'id', 'tedit_geschlechtid');
    $this->assertHtmlAttribute($res, 'size', '1');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlechtclass', false);
    $this->assertSelectOption($res, 'Frau', 'W');
    $this->assertSelectOption($res, 'Herr', 'M');

    //Mit Pflichtfeld:
    $varname = 'geschlecht_mw_anrede_pflichtfeld:Geschlecht';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht');
    $this->assertHtmlAttribute($res, 'id', 'tedit_geschlechtid');
    $this->assertHtmlAttribute($res, 'size', '1');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlechtclass', false);
    $this->assertSelectOption($res, 'Frau', 'W');
    $this->assertSelectOption($res, 'Herr', 'M');
    //Hidden Input
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht_pflichtfeld');
    $this->assertHtmlAttribute($res, 'type', 'hidden');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlecht_pflichtfeldclass', false);
    $this->assertHtmlAttribute($res, 'value', 'Geschlecht');

    $varname = 'geschlecht_mw_anrede_readonly';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht');
    $this->assertHtmlAttribute($res, 'id', 'tedit_geschlechtid');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlechtclass', false);
    $this->assertHtmlAttribute($res, 'disabled', 'disabled');
  }

  /**
   * @covers ExportCalculation::getVarValue4TeilnehmerEdit()
   * @test
   */
  public function getVarValue4TeilnehmerEdit_withDataBinding_geschlecht_mw_anrede()
  {
    $this->object->isDataBinding = true;

    $kw = '';
    if (DBWorkBASysSettings::isKornwestheimEbz()) {
      $kw = ",{ wert: '', bezeichnung: 'Keine Angabe'}";
    }

    $varname = 'geschlecht_mw_anrede';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht');
    $this->assertHtmlAttribute($res, 'id', 'tedit_geschlechtid');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlechtclass', false);
    $this->assertHtmlAttribute($res, 'data-bind', 'options: \\[{ wert: [\'"]W[\'"], bezeichnung: [\'"]Frau[\'"]},{ wert: [\'"]M[\'"], bezeichnung: [\'"]Herr[\'"]}' . $kw . '], value:hauptTn\\(\\).geschlecht, optionsText: \'bezeichnung\', optionsValue: \'wert\'');

    //Mit Pflichtfeld:
    $varname = 'geschlecht_mw_anrede_pflichtfeld:Geschlecht';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht');
    $this->assertHtmlAttribute($res, 'id', 'tedit_geschlechtid');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlechtclass', false);
    $this->assertHtmlAttribute($res, 'data-bind', 'options: \\[{ wert: [\'"]W[\'"], bezeichnung: [\'"]Frau[\'"]},{ wert: [\'"]M[\'"], bezeichnung: [\'"]Herr[\'"]}' . $kw . '], value:hauptTn\\(\\).geschlecht, optionsText: \'bezeichnung\', optionsValue: \'wert\'');

    $varname = 'geschlecht_mw_anrede_def';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht');
    $this->assertHtmlAttribute($res, 'id', 'tedit_geschlechtid');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlechtclass', false);
    $this->assertHtmlAttribute($res, 'data-bind', 'options: \\[{ wert: [\'"][\'"], bezeichnung: [\'"]Bitte w&auml;hlen[\'"]},{ wert: [\'"]W[\'"], bezeichnung: [\'"]Frau[\'"]},{ wert: [\'"]M[\'"], bezeichnung: [\'"]Herr[\'"]}' . $kw . '], value:hauptTn\\(\\).geschlecht, optionsText: \'bezeichnung\', optionsValue: \'wert\'');

    $varname = 'geschlecht_mw_anrede_readonly';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_geschlecht');
    $this->assertHtmlAttribute($res, 'id', 'tedit_geschlechtid');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_geschlechtclass', false);
    $this->assertHtmlAttribute($res, 'data-bind', 'options: \\[{ wert: [\'"]W[\'"], bezeichnung: [\'"]Frau[\'"]},{ wert: [\'"]M[\'"], bezeichnung: [\'"]Herr[\'"]}' . $kw . '], value:hauptTn\\(\\).geschlecht, optionsText: \'bezeichnung\', optionsValue: \'wert\', disable: true');
  }

  /**
   * @covers ExportCalculation::getVarValue4TeilnehmerEdit()
   * @test
   */
  public function getVarValue4System_get_datum()
  {
    $_GET['a'] = '02.08.2013';
    $values = array('get_mmmm:a' => 'August', 'get_mmm:a' => 'Aug.', 'get_mm:a' => '08', 'get_m:a' => '8',
          'get_jjjj:a' => '2013', 'get_jj:a' => '13', 'get_tt:a' => '02', 'get_t:a' => '2',
          'get_wochentag:a' => 'Freitag', 'get_wochentag_kurz:a' => 'Fr.');
    foreach ($values as $var => $expected) {
      $this->assertEquals($expected, $this->object->getVarValue4System($var));
    }
  }

  /**
   * @covers ExportCalculation::getVarValue4TeilnehmerEdit()
   * @test
   */
  public function getVarValue4TeilnehmerEdit_nation_hinterlegung()
  {
    $this->object->isDataBinding = false;
    $varname = 'nation_hinterlegung_def';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_nation');
    $this->assertHtmlAttribute($res, 'id', 'tedit_nationid');
    $this->assertHtmlAttribute($res, 'size', '1');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_nationclass' . (KW_BOOTSTRAP ? ' form-control' : ''), false);
    $this->assertSelectOption($res, 'Bitte w&auml;hlen', '');
    $this->assertSelectOption($res, 'Belgien', 'Belgien');
    $this->assertSelectOption($res, 'Deutschland', 'Deutschland');

    $varname = 'nation_hinterlegung_def_pflichtfeld:Land';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_nation');
    $this->assertHtmlAttribute($res, 'id', 'tedit_nationid');
    $this->assertHtmlAttribute($res, 'size', '1');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_nationclass' . (KW_BOOTSTRAP ? ' form-control' : ''), false);
    $this->assertSelectOption($res, 'Bitte w&auml;hlen', '');
    $this->assertSelectOption($res, 'Belgien', 'Belgien');
    $this->assertSelectOption($res, 'Deutschland', 'Deutschland');
    //Hidden Input
    $this->assertHtmlAttribute($res, 'name', 'tedit_nation_pflichtfeld');
    $this->assertHtmlAttribute($res, 'type', 'hidden');
    $this->assertHtmlAttribute($res, 'class', 'tedit tedit_nation_pflichtfeldclass', false);
    $this->assertHtmlAttribute($res, 'value', 'Land');
  }

  /**
   * @covers ExportCalculation::getVarValue4TeilnehmerEdit()
   * @test
   */
  public function getVarValue4TeilnehmerEdit_mehrnation_hinterlegung()
  {
    $this->object->isDataBinding = false;
    $varname = 'nation_hinterlegung_def';
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht(), 'mehr', 'mehr');
    $this->assertHtmlAttribute($res, 'name', 'teditmehr_nation');
    $this->assertHtmlAttribute($res, 'id', 'tedit_nationid');
    $this->assertHtmlAttribute($res, 'size', '1');
    $this->assertHtmlAttribute($res, 'class', 'tedit teditmehr_nationclass' . (KW_BOOTSTRAP ? ' form-control' : ''), false);
    $this->assertSelectOption($res, 'Bitte w&auml;hlen', '');
    $this->assertSelectOption($res, 'Belgien', 'Belgien');
    $this->assertSelectOption($res, 'Deutschland', 'Deutschland');
  }

  /**
   * @covers ExportCalculation::getVarValue4TeilnehmerEdit()
   * @test
   */
  public function getVarValue4TeilnehmerEdit_alterskl()
  {
    $varname = 'alterskl_pflichtfeld:Altersklasse';

    //altes Anmeldeverfahren
    $this->object->isDataBinding = false;
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_alterskl');
    $this->assertHtmlAttribute($res, 'id', 'tedit_altersklid');
    $this->assertHtmlAttribute($res, 'size', '1');
    $this->assertHtmlAttribute($res, 'class', (KW_BOOTSTRAP ? 'form-control ' : '') . 'tedit tedit_altersclass', false);
    //Achtung: abhängig von der DB Hinterlegung, könnte also abweichen
    $this->assertSelectOption2($res, '7: ohne Angabe', '0');
    $this->assertSelectOption2($res, '1: bis 18 J.', '1');
    $this->assertSelectOption2($res, '2: bis 25 J.', '2');
    $this->assertSelectOption2($res, '3: bis 35 J.', '3');
    $this->assertSelectOption2($res, '4: bis 50 J.', '4');
    $this->assertSelectOption2($res, '5: bis 65 J.', '5');
    $this->assertSelectOption2($res, '6: &uuml;ber 65 J.', '6');
    $this->assertStringNotContainsString('data-bind', $res, 'Output contains data-binding, but it should not');

    //Hidden Input
    $this->assertPflichtfeld($res, 'alterskl', 'Altersklasse');

    //neues Anmeldeverfahren
    $this->object->isDataBinding = true;
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_alterskl');
    $this->assertHtmlAttribute($res, 'id', 'tedit_altersklid');
    $this->assertHtmlAttribute($res, 'size', '1');
    $this->assertHtmlAttribute($res, 'class', (KW_BOOTSTRAP ? 'form-control ' : '') . 'tedit tedit_altersclass', false);
    //Achtung: abhängig von der DB Hinterlegung, könnte also abweichen
    $this->assertNotSelectOption($res, '7: ohne Angabe', '0');
    $this->assertStringContainsString('data-bind', $res, 'Output does not contain data-binding');
    $this->assertStringContainsString("{ alterskl: '7: ohne Angabe', wert: '0' }", $res, 'Output does not contain data-bind option "ohne Angabe"');

    //Hidden Input
    $this->assertPflichtfeld($res, 'alterskl', 'Altersklasse');
  }

  /**
   * @covers ExportCalculation::getVarValue4TeilnehmerEdit()
   * @test
   */
  public function getVarValue4TeilnehmerEdit_alterskl_profil()
  {
    $varname = 'alterskl_profil_pflichtfeld:Altersklasse';

    //altes Anmeldeverfahren / Profil
    $this->object->isDataBinding = false;
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_alterskl');
    $this->assertHtmlAttribute($res, 'id', 'tedit_altersklid');
    $this->assertHtmlAttribute($res, 'size', '1');
    $this->assertHtmlAttribute($res, 'class', (KW_BOOTSTRAP ? 'form-control ' : '') . 'tedit tedit_altersclass', false);
    //Achtung: abhängig von der DB Hinterlegung, könnte also abweichen
    $this->assertSelectOption2($res, '7: ohne Angabe', '0');
    $this->assertSelectOption2($res, '1: bis 18 J.', '1');
    $this->assertSelectOption2($res, '2: bis 25 J.', '2');
    $this->assertSelectOption2($res, '3: bis 35 J.', '3');
    $this->assertSelectOption2($res, '4: bis 50 J.', '4');
    $this->assertSelectOption2($res, '5: bis 65 J.', '5');
    $this->assertSelectOption2($res, '6: &uuml;ber 65 J.', '6');
    $this->assertStringNotContainsString('data-bind', $res, 'Output contains data-binding, but it should not');

    //altes Anmeldeverfahren / Profil
    $this->object->isDataBinding = true;//hier muss dasselbe ausgegeben werden, wie oben
    $res = $this->object->getVarValue4TeilnehmerEdit($varname, new TeilnehmerPflicht());
    $this->assertHtmlAttribute($res, 'name', 'tedit_alterskl');
    $this->assertHtmlAttribute($res, 'id', 'tedit_altersklid');
    $this->assertHtmlAttribute($res, 'size', '1');
    $this->assertHtmlAttribute($res, 'class', (KW_BOOTSTRAP ? 'form-control ' : '') . 'tedit tedit_altersclass', false);
    //Achtung: abhängig von der DB Hinterlegung, könnte also abweichen
    $this->assertSelectOption2($res, '7: ohne Angabe', '0');
    $this->assertSelectOption2($res, '1: bis 18 J.', '1');
    $this->assertSelectOption2($res, '2: bis 25 J.', '2');
    $this->assertSelectOption2($res, '3: bis 35 J.', '3');
    $this->assertSelectOption2($res, '4: bis 50 J.', '4');
    $this->assertSelectOption2($res, '5: bis 65 J.', '5');
    $this->assertSelectOption2($res, '6: &uuml;ber 65 J.', '6');
    $this->assertStringNotContainsString('data-bind', $res, 'Output contains data-binding, but it should not');
  }

  /**
   * @covers ExportCalculation::getVorbelegung()
   * @test
   */
  public function getVorbelegung_MitNachrichtMitVorbelegung()
  {
    $arg = 'vorname_pflichtfeld:VornameMeldung:_:VornameVB';
    $expected = 'VornameVB';
    $this->assertEquals($expected, $this->object->getVorbelegungFromVarname($arg));

    $arg = 'vorname_pflichtfeld:VornameMeldung:_:VornameVB:_:PseudoZweiteVorbelegung';
    $expected = 'VornameVB:_:PseudoZweiteVorbelegung';
    $this->assertEquals($expected, $this->object->getVorbelegungFromVarname($arg));
  }

  /**
   * @covers ExportCalculation::getVorbelegung()
   * @test
   */
  public function getVorbelegung_ohneNachrichtMitVorbelegung()
  {
    $arg = 'vorname_pflichtfeld:_:VornameVB';
    $expected = 'VornameVB';
    $this->assertEquals($expected, $this->object->getVorbelegungFromVarname($arg));
  }

  /**
   * @covers ExportCalculation::getVorbelegung()
   * @test
   */
  public function getVorbelegung_ohneNachrichtOhneVorbelegung()
  {
    $arg = 'vorname_pflichtfeld';
    $expected = '';
    $this->assertEquals($expected, $this->object->getVorbelegungFromVarname($arg));
  }

  /**
   * @covers ExportCalculation::getVorbelegung()
   * @test
   */
  public function getVorbelegung_MitNachrichtOhneVorbelegung()
  {
    $arg = 'vorname_pflichtfeld:VornameMeldung';
    $expected = '';
    $this->assertEquals($expected, $this->object->getVorbelegungFromVarname($arg));
  }

  /**
   * @covers ExportCalculation::getVarnameWithoutVorbelegung()
   * @test
   */
  public function getVarnameWithoutVorbelegung_MitNachrichtMitVorbelegung()
  {
    $arg = 'vorname_pflichtfeld:VornameMeldung:_:VornameVB';
    $expected = 'vorname_pflichtfeld:VornameMeldung';
    $this->assertEquals($expected, $this->object->getVarnameWithoutVorbelegung($arg));
  }

  /**
   * @covers ExportCalculation::getVarnameWithoutVorbelegung()
   * @test
   */
  public function getVarnameWithoutVorbelegung_OhneNachrichtMitVorbelegung()
  {
    $arg = 'vorname_pflichtfeld:_:VornameVB';
    $expected = 'vorname_pflichtfeld';
    $this->assertEquals($expected, $this->object->getVarnameWithoutVorbelegung($arg));
  }

  /**
   * @covers ExportCalculation::getVarnameWithoutVorbelegung()
   * @test
   */
  public function getVarnameWithoutVorbelegung_MitNachrichtOhneVorbelegung()
  {
    $arg = 'vorname_pflichtfeld:VornameMeldung';
    $expected = 'vorname_pflichtfeld:VornameMeldung';
    $this->assertEquals($expected, $this->object->getVarnameWithoutVorbelegung($arg));
  }

  /**
   * @covers ExportCalculation::getVarnameWithoutVorbelegung()
   * @test
   */
  public function getVarnameWithoutVorbelegung_OhneNachrichtOhneVorbelegung()
  {
    $arg = 'vorname_pflichtfeld';
    $expected = 'vorname_pflichtfeld';
    $this->assertEquals($expected, $this->object->getVarnameWithoutVorbelegung($arg));
  }

  /**
   * @covers ExportCalculation::getVarnameWithoutParamOrPflichtfeld()
   * @test
   */
  public function getVarnameWithoutParamOrPflichtfeld_MitNachrichtMitVorbelegung()
  {
    $arg = 'vorname:VornameMeldung:_:VornameVB';
    $expected = 'vorname';
    $this->assertEquals($expected, $this->object->getVarnameWithoutParamOrPflichtfeld($arg));

    $arg = 'vorname_pflichtfeld:VornameMeldung:_:VornameVB';
    $expected = 'vorname';
    $this->assertEquals($expected, $this->object->getVarnameWithoutParamOrPflichtfeld($arg));
  }

  /**
   * @covers ExportCalculation::getVarnameWithoutParamOrPflichtfeld()
   * @test
   */
  public function getVarnameWithoutParamOrPflichtfeld_MitNachrichtOhneVorbelegung()
  {
    $arg = 'vorname:VornameMeldung';
    $expected = 'vorname';
    $this->assertEquals($expected, $this->object->getVarnameWithoutParamOrPflichtfeld($arg));

    $arg = 'vorname_pflichtfeld:VornameMeldung';
    $expected = 'vorname';
    $this->assertEquals($expected, $this->object->getVarnameWithoutParamOrPflichtfeld($arg));
  }

  /**
   * @covers ExportCalculation::getVarnameWithoutParamOrPflichtfeld()
   * @test
   */
  public function getVarnameWithoutParamOrPflichtfeld_OhneNachrichtMitVorbelegung()
  {
    $arg = 'vorname:_:VornameVB';
    $expected = 'vorname';
    $this->assertEquals($expected, $this->object->getVarnameWithoutParamOrPflichtfeld($arg));

    $arg = 'vorname_pflichtfeld:_:VornameVB';
    $expected = 'vorname';
    $this->assertEquals($expected, $this->object->getVarnameWithoutParamOrPflichtfeld($arg));
  }

  /**
   * @covers ExportCalculation::getVarnameWithoutParamOrPflichtfeld()
   * @test
   */
  public function getVarnameWithoutParamOrPflichtfeld_OhneNachrichtOhneVorbelegung()
  {
    $arg = 'vorname';
    $expected = 'vorname';
    $this->assertEquals($expected, $this->object->getVarnameWithoutParamOrPflichtfeld($arg));

    $arg = 'vorname_pflichtfeld';
    $expected = 'vorname';
    $this->assertEquals($expected, $this->object->getVarnameWithoutParamOrPflichtfeld($arg));
  }

  /**
   * @covers ExportCalculation::getVarValue4TeilnehmerEdit()
   * @test
   */
  public function getVarValue4Formular_nurnichtvolle()
  {
    $varname = 'nurnichtvolle';
    $kfsVarname = 'kfs_' . $varname;

    $tmp = SessionOperations::getVarValueSuche($kfsVarname, '');
    //Test nicht vorbelegt
    SessionOperations::setVarValueSuche($kfsVarname, '');
    $res = $this->object->getVarValue4Formular($varname, new Datamodul());
    $this->assertHtmlAttribute($res, 'name', $kfsVarname);
    $this->assertHtmlAttribute($res, 'type', 'checkbox');
    $this->assertHtmlAttribute($res, 'id', $kfsVarname . 'id');
    $this->assertHtmlAttribute($res, 'value', '1');
    $this->assertStringNotContainsString('checked', $res, 'Output is checked but shouldn\'t be');
    //Test vorbelegt
    SessionOperations::setVarValueSuche($kfsVarname, '1');
    $res = $this->object->getVarValue4Formular($varname, new Datamodul());
    $this->assertStringContainsString('checked', $res, 'Output is not checked but should be');

    //Session wiederherstellen
    SessionOperations::setVarValueAnm($kfsVarname, $tmp);
  }

  /**
   * @covers ExportCalculation::getVarValue4System()
   * @test
   */
  public function getVarValue4System_sortierung()
  {
    $input_expected = array(
        'sortierung_dozsort' => 'dozsort',
        'sortierung_knr' => 'nr',
        'sortierung_datum' => 'beginn_dat',
        'sortierung_datumzeit' => 'beginndt',
        'sortierung_titel' => 'kurzbez',
        'sortierung_aussenstelle' => 'aussenst',
        'sortierung_kursauswahl2' => 'kursauswahl2'
      );

    foreach ($input_expected as $input => $expected) {
      $expected_url = 'index.php?urlparameter=orderby%3A' . $expected . '%3B';
      $this->assertEquals($expected_url, $this->object->getVarValue4System($input));
    }
  }

  /**
   * @covers ExportCalculation::getParamWithoutVorbelegung()
   * @test
   */
  public function getParamWithoutVorbelegung_paramWithoutVorbelegung_returnsParam()
  {
    $this->assertEquals('param', $this->object->getParamWithoutVorbelegung('my_special_varname:param'));
  }

  /**
   * @covers ExportCalculation::getParamWithoutVorbelegung()
   * @test
   */
  public function getParamWithoutVorbelegung_paramWithoutColon_returnsEmptyString()
  {
    $this->assertEquals('', $this->object->getParamWithoutVorbelegung('my_special_varname'));
  }

  /**
   * @covers ExportCalculation::getParamWithoutVorbelegung()
   * @test
   */
  public function getParamWithoutVorbelegung_paramWithVorbelegung_returnsParam()
  {
    $this->assertEquals('param', $this->object->getParamWithoutVorbelegung('my_special_varname:param:_:vorbelegung'));
  }

  /**
   * @covers ExportCalculation::getParamWithoutVorbelegung()
   * @test
   */
  public function getParamWithoutVorbelegung_paramWithOnlyVorbelegung_returnsEmptyString()
  {
    $this->assertEquals('', $this->object->getParamWithoutVorbelegung('my_special_varname:_:vorbelegung'));
  }
}
