/**
  * @dataProvider data_resolverStyle
  */
 public function test_resolverStyle($str, ResolverStyle $style, $expectedEx, $year, $month, $day)
 {
     $builder = new DateTimeFormatterBuilder();
     $builder->appendValue(ChronoField::YEAR_OF_ERA());
     $builder->appendLiteral("/");
     $builder->appendValue(ChronoField::MONTH_OF_YEAR());
     $builder->appendLiteral("/");
     $builder->appendValue(ChronoField::DAY_OF_MONTH());
     $eraMap = [1 => "CE", 0 => "BCE"];
     $optionalFormatter = (new DateTimeFormatterBuilder())->appendLiteral(" ")->appendText3(ChronoField::ERA(), $eraMap)->toFormatter();
     $formatter = $builder->appendOptional($optionalFormatter)->toFormatter();
     $formatter = $formatter->withResolverStyle($style);
     if ($expectedEx == null) {
         $accessor = $formatter->parse($str);
         $this->assertEquals($accessor->get(ChronoField::YEAR_OF_ERA()), $year);
         $this->assertEquals($accessor->get(ChronoField::MONTH_OF_YEAR()), $month);
         $this->assertEquals($accessor->get(ChronoField::DAY_OF_MONTH()), $day);
     } else {
         try {
             $formatter->parse($str);
             $this->fail();
         } catch (\Exception $ex) {
             $this->assertInstanceOf($expectedEx, $ex);
         }
     }
 }
 /**
  * @dataProvider data_combine
  */
 public function test_derive($field1, $value1, $field2, $value2, $field3, $value3, $field4, $value4, $query, $expectedVal)
 {
     $str = "";
     $dtfb = new DateTimeFormatterBuilder();
     $dtfb->appendValue($field1)->appendLiteral('-');
     $str .= $value1 . "-";
     if ($field2 != null) {
         $dtfb->appendValue($field2)->appendLiteral('-');
         $str .= $value2 . "-";
     }
     if ($field3 != null) {
         $dtfb->appendValue($field3)->appendLiteral('-');
         $str .= $value3 . "-";
     }
     if ($field4 != null) {
         $dtfb->appendValue($field4)->appendLiteral('-');
         $str .= $value4 . "-";
     }
     $parsed = $dtfb->toFormatter()->parse($str);
     if ($query == LocalDate::class) {
         if ($expectedVal != null) {
             $this->assertEquals($parsed->query(LocalDate::fromQuery()), $expectedVal);
         } else {
             try {
                 $parsed->query(LocalDate::fromQuery());
                 $this->fail();
             } catch (DateTimeException $ex) {
                 // expected
             }
         }
     } else {
         throw new IllegalArgumentException();
     }
 }
 public function test_adjacent_strict_firstVariableWidth_fails()
 {
     // fails because literal is a number and variable width parse greedily absorbs it
     $f = $this->builder->appendValue(ChronoField::HOUR_OF_DAY())->appendValue2(ChronoField::MINUTE_OF_HOUR(), 2)->appendLiteral('9')->toFormatter2(Locale::UK());
     $pp = new ParsePosition(0);
     $parsed = $f->parseUnresolved("12309", $pp);
     $this->assertEquals($pp->getErrorIndex(), 5);
     $this->assertEquals($parsed, null);
 }
 public function test_optionalStartEnd_immediateStartEnd()
 {
     $this->builder->appendValue(CF::MONTH_OF_YEAR())->optionalStart()->optionalEnd()->appendValue(CF::DAY_OF_MONTH());
     $f = $this->builder->toFormatter();
     $this->assertEquals($f->__toString(), "Value(MonthOfYear)Value(DayOfMonth)");
 }