628 @DataProvider(name="validPatterns") 629 Object[][] dataValid() { 630 return new Object[][] { 631 {"'a'", "'a'"}, 632 {"''", "''"}, 633 {"'!'", "'!'"}, 634 {"!", "'!'"}, 635 636 {"'hello_people,][)('", "'hello_people,][)('"}, 637 {"'hi'", "'hi'"}, 638 {"'yyyy'", "'yyyy'"}, 639 {"''''", "''"}, 640 {"'o''clock'", "'o''clock'"}, 641 642 {"G", "Text(Era,SHORT)"}, 643 {"GG", "Text(Era,SHORT)"}, 644 {"GGG", "Text(Era,SHORT)"}, 645 {"GGGG", "Text(Era)"}, 646 {"GGGGG", "Text(Era,NARROW)"}, 647 648 {"y", "Value(Year)"}, 649 {"yy", "ReducedValue(Year,2,2000)"}, 650 {"yyy", "Value(Year,3,19,NORMAL)"}, 651 {"yyyy", "Value(Year,4,19,EXCEEDS_PAD)"}, 652 {"yyyyy", "Value(Year,5,19,EXCEEDS_PAD)"}, 653 654 // {"Y", "Value(WeekBasedYear)"}, 655 // {"YY", "ReducedValue(WeekBasedYear,2,2000)"}, 656 // {"YYY", "Value(WeekBasedYear,3,19,NORMAL)"}, 657 // {"YYYY", "Value(WeekBasedYear,4,19,EXCEEDS_PAD)"}, 658 // {"YYYYY", "Value(WeekBasedYear,5,19,EXCEEDS_PAD)"}, 659 660 {"M", "Value(MonthOfYear)"}, 661 {"MM", "Value(MonthOfYear,2)"}, 662 {"MMM", "Text(MonthOfYear,SHORT)"}, 663 {"MMMM", "Text(MonthOfYear)"}, 664 {"MMMMM", "Text(MonthOfYear,NARROW)"}, 665 666 {"D", "Value(DayOfYear)"}, 667 {"DD", "Value(DayOfYear,2)"}, 668 {"DDD", "Value(DayOfYear,3)"}, 669 670 {"d", "Value(DayOfMonth)"}, 671 {"dd", "Value(DayOfMonth,2)"}, 672 {"ddd", "Value(DayOfMonth,3)"}, 673 674 {"F", "Value(AlignedWeekOfMonth)"}, 675 {"FF", "Value(AlignedWeekOfMonth,2)"}, 676 {"FFF", "Value(AlignedWeekOfMonth,3)"}, 677 678 {"Q", "Value(QuarterOfYear)"}, 679 {"QQ", "Value(QuarterOfYear,2)"}, 680 {"QQQ", "Text(QuarterOfYear,SHORT)"}, 681 {"QQQQ", "Text(QuarterOfYear)"}, 682 {"QQQQQ", "Text(QuarterOfYear,NARROW)"}, 683 684 {"E", "Value(DayOfWeek)"}, 685 {"EE", "Value(DayOfWeek,2)"}, 686 {"EEE", "Text(DayOfWeek,SHORT)"}, 687 {"EEEE", "Text(DayOfWeek)"}, 688 {"EEEEE", "Text(DayOfWeek,NARROW)"}, 689 690 {"a", "Text(AmPmOfDay,SHORT)"}, 691 {"aa", "Text(AmPmOfDay,SHORT)"}, 692 {"aaa", "Text(AmPmOfDay,SHORT)"}, 693 {"aaaa", "Text(AmPmOfDay)"}, 694 {"aaaaa", "Text(AmPmOfDay,NARROW)"}, 695 696 {"H", "Value(HourOfDay)"}, 697 {"HH", "Value(HourOfDay,2)"}, 698 {"HHH", "Value(HourOfDay,3)"}, 699 700 {"K", "Value(HourOfAmPm)"}, 701 {"KK", "Value(HourOfAmPm,2)"}, 702 {"KKK", "Value(HourOfAmPm,3)"}, 703 704 {"k", "Value(ClockHourOfDay)"}, 705 {"kk", "Value(ClockHourOfDay,2)"}, 706 {"kkk", "Value(ClockHourOfDay,3)"}, 707 708 {"h", "Value(ClockHourOfAmPm)"}, 709 {"hh", "Value(ClockHourOfAmPm,2)"}, 710 {"hhh", "Value(ClockHourOfAmPm,3)"}, 711 712 {"m", "Value(MinuteOfHour)"}, 713 {"mm", "Value(MinuteOfHour,2)"}, 714 {"mmm", "Value(MinuteOfHour,3)"}, 715 716 {"s", "Value(SecondOfMinute)"}, 717 {"ss", "Value(SecondOfMinute,2)"}, 718 {"sss", "Value(SecondOfMinute,3)"}, 719 720 {"S", "Fraction(NanoOfSecond,1,1)"}, 721 {"SS", "Fraction(NanoOfSecond,2,2)"}, 722 {"SSS", "Fraction(NanoOfSecond,3,3)"}, 723 {"SSSSSSSSS", "Fraction(NanoOfSecond,9,9)"}, 724 725 {"A", "Value(MilliOfDay)"}, 726 {"AA", "Value(MilliOfDay,2)"}, 727 {"AAA", "Value(MilliOfDay,3)"}, 728 729 {"n", "Value(NanoOfSecond)"}, 730 {"nn", "Value(NanoOfSecond,2)"}, 731 {"nnn", "Value(NanoOfSecond,3)"}, 732 733 {"N", "Value(NanoOfDay)"}, 734 {"NN", "Value(NanoOfDay,2)"}, 735 {"NNN", "Value(NanoOfDay,3)"}, 736 737 {"z", "ZoneText(SHORT)"}, 738 {"zz", "ZoneText(SHORT)"}, 743 744 {"Z", "Offset(+HHMM,'+0000')"}, // SimpleDateFormat 745 {"ZZ", "Offset(+HHMM,'+0000')"}, // SimpleDateFormat 746 {"ZZZ", "Offset(+HHMM,'+0000')"}, // SimpleDateFormat 747 748 {"X", "Offset(+HHmm,'Z')"}, // LDML/almost SimpleDateFormat 749 {"XX", "Offset(+HHMM,'Z')"}, // LDML/SimpleDateFormat 750 {"XXX", "Offset(+HH:MM,'Z')"}, // LDML/SimpleDateFormat 751 {"XXXX", "Offset(+HHMMss,'Z')"}, // LDML 752 {"XXXXX", "Offset(+HH:MM:ss,'Z')"}, // LDML 753 754 {"x", "Offset(+HHmm,'+00')"}, // LDML 755 {"xx", "Offset(+HHMM,'+0000')"}, // LDML 756 {"xxx", "Offset(+HH:MM,'+00:00')"}, // LDML 757 {"xxxx", "Offset(+HHMMss,'+0000')"}, // LDML 758 {"xxxxx", "Offset(+HH:MM:ss,'+00:00')"}, // LDML 759 760 {"ppH", "Pad(Value(HourOfDay),2)"}, 761 {"pppDD", "Pad(Value(DayOfYear,2),3)"}, 762 763 {"yyyy[-MM[-dd", "Value(Year,4,19,EXCEEDS_PAD)['-'Value(MonthOfYear,2)['-'Value(DayOfMonth,2)]]"}, 764 {"yyyy[-MM[-dd]]", "Value(Year,4,19,EXCEEDS_PAD)['-'Value(MonthOfYear,2)['-'Value(DayOfMonth,2)]]"}, 765 {"yyyy[-MM[]-dd]", "Value(Year,4,19,EXCEEDS_PAD)['-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)]"}, 766 767 {"yyyy-MM-dd'T'HH:mm:ss.SSS", "Value(Year,4,19,EXCEEDS_PAD)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)" + 768 "'T'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)'.'Fraction(NanoOfSecond,3,3)"}, 769 770 {"e", "WeekBased(e1)"}, 771 {"w", "WeekBased(w1)"}, 772 {"W", "WeekBased(W1)"}, 773 {"WW", "WeekBased(W2)"}, 774 775 }; 776 } 777 778 @Test(dataProvider="validPatterns", groups={"implementation"}) 779 public void test_appendPattern_valid(String input, String expected) throws Exception { 780 builder.appendPattern(input); 781 DateTimeFormatter f = builder.toFormatter(); 782 assertEquals(f.toString(), expected); 783 } 784 785 //----------------------------------------------------------------------- 786 @DataProvider(name="invalidPatterns") 787 Object[][] dataInvalid() { 788 return new Object[][] { 789 {"'"}, 790 {"'hello"}, 791 {"'hel''lo"}, 792 {"'hello''"}, 793 {"{"}, 794 {"}"}, 795 {"{}"}, 796 {"]"}, 797 {"yyyy]"}, 798 {"yyyy]MM"}, 799 {"yyyy[MM]]"}, 800 801 {"MMMMMM"}, 802 {"QQQQQQ"}, 803 {"EEEEEE"}, 804 {"aaaaaa"}, 805 {"ZZZZ"}, 806 {"XXXXXX"}, 807 {"zzzzz"}, 808 {"V"}, 809 {"VVV"}, 810 {"VVVV"}, 811 {"VVVVV"}, 812 813 {"RO"}, 814 815 {"p"}, 816 {"pp"}, 817 {"p:"}, 818 819 {"f"}, 820 {"ff"}, 821 {"f:"}, 822 {"fy"}, 823 {"fa"}, 824 {"fM"}, 825 826 {"ww"}, 827 {"ee"}, 828 {"WWW"}, 829 }; 830 } 831 832 @Test(dataProvider="invalidPatterns", expectedExceptions=IllegalArgumentException.class) 833 public void test_appendPattern_invalid(String input) throws Exception { 834 try { 835 builder.appendPattern(input); 836 } catch (IllegalArgumentException ex) { 837 throw ex; 838 } 839 } 840 841 //----------------------------------------------------------------------- 842 @DataProvider(name="patternPrint") 843 Object[][] data_patternPrint() { 844 return new Object[][] { 845 {"Q", date(2012, 2, 10), "1"}, 846 {"QQ", date(2012, 2, 10), "01"}, 847 // {"QQQ", date(2012, 2, 10), "Q1"}, // TODO: data for quarters? 848 // {"QQQQ", date(2012, 2, 10), "Q1"}, 849 // {"QQQQQ", date(2012, 2, 10), "Q1"}, 850 }; 851 } 852 853 @Test(dataProvider="patternPrint") 854 public void test_appendPattern_patternPrint(String input, Temporal temporal, String expected) throws Exception { 855 DateTimeFormatter f = builder.appendPattern(input).toFormatter(Locale.UK); 856 String test = f.format(temporal); 857 assertEquals(test, expected); 858 } 859 860 private static Temporal date(int y, int m, int d) { 861 return LocalDate.of(y, m, d); 862 } 863 864 } | 628 @DataProvider(name="validPatterns") 629 Object[][] dataValid() { 630 return new Object[][] { 631 {"'a'", "'a'"}, 632 {"''", "''"}, 633 {"'!'", "'!'"}, 634 {"!", "'!'"}, 635 636 {"'hello_people,][)('", "'hello_people,][)('"}, 637 {"'hi'", "'hi'"}, 638 {"'yyyy'", "'yyyy'"}, 639 {"''''", "''"}, 640 {"'o''clock'", "'o''clock'"}, 641 642 {"G", "Text(Era,SHORT)"}, 643 {"GG", "Text(Era,SHORT)"}, 644 {"GGG", "Text(Era,SHORT)"}, 645 {"GGGG", "Text(Era)"}, 646 {"GGGGG", "Text(Era,NARROW)"}, 647 648 {"u", "Value(Year)"}, 649 {"uu", "ReducedValue(Year,2,2000)"}, 650 {"uuu", "Value(Year,3,19,NORMAL)"}, 651 {"uuuu", "Value(Year,4,19,EXCEEDS_PAD)"}, 652 {"uuuuu", "Value(Year,5,19,EXCEEDS_PAD)"}, 653 654 {"y", "Value(YearOfEra)"}, 655 {"yy", "ReducedValue(YearOfEra,2,2000)"}, 656 {"yyy", "Value(YearOfEra,3,19,NORMAL)"}, 657 {"yyyy", "Value(YearOfEra,4,19,EXCEEDS_PAD)"}, 658 {"yyyyy", "Value(YearOfEra,5,19,EXCEEDS_PAD)"}, 659 660 {"Y", "Localized(WeekBasedYear)"}, 661 {"YY", "Localized(ReducedValue(WeekBasedYear,2,2000))"}, 662 {"YYY", "Localized(WeekBasedYear,3,19,NORMAL)"}, 663 {"YYYY", "Localized(WeekBasedYear,4,19,EXCEEDS_PAD)"}, 664 {"YYYYY", "Localized(WeekBasedYear,5,19,EXCEEDS_PAD)"}, 665 666 {"M", "Value(MonthOfYear)"}, 667 {"MM", "Value(MonthOfYear,2)"}, 668 {"MMM", "Text(MonthOfYear,SHORT)"}, 669 {"MMMM", "Text(MonthOfYear)"}, 670 {"MMMMM", "Text(MonthOfYear,NARROW)"}, 671 672 {"L", "Value(MonthOfYear)"}, 673 {"LL", "Value(MonthOfYear,2)"}, 674 {"LLL", "Text(MonthOfYear,SHORT_STANDALONE)"}, 675 {"LLLL", "Text(MonthOfYear,FULL_STANDALONE)"}, 676 {"LLLLL", "Text(MonthOfYear,NARROW_STANDALONE)"}, 677 678 {"D", "Value(DayOfYear)"}, 679 {"DD", "Value(DayOfYear,2)"}, 680 {"DDD", "Value(DayOfYear,3)"}, 681 682 {"d", "Value(DayOfMonth)"}, 683 {"dd", "Value(DayOfMonth,2)"}, 684 685 {"F", "Value(AlignedDayOfWeekInMonth)"}, 686 687 {"Q", "Value(QuarterOfYear)"}, 688 {"QQ", "Value(QuarterOfYear,2)"}, 689 {"QQQ", "Text(QuarterOfYear,SHORT)"}, 690 {"QQQQ", "Text(QuarterOfYear)"}, 691 {"QQQQQ", "Text(QuarterOfYear,NARROW)"}, 692 693 {"q", "Value(QuarterOfYear)"}, 694 {"qq", "Value(QuarterOfYear,2)"}, 695 {"qqq", "Text(QuarterOfYear,SHORT_STANDALONE)"}, 696 {"qqqq", "Text(QuarterOfYear,FULL_STANDALONE)"}, 697 {"qqqqq", "Text(QuarterOfYear,NARROW_STANDALONE)"}, 698 699 {"E", "Text(DayOfWeek,SHORT)"}, 700 {"EE", "Text(DayOfWeek,SHORT)"}, 701 {"EEE", "Text(DayOfWeek,SHORT)"}, 702 {"EEEE", "Text(DayOfWeek)"}, 703 {"EEEEE", "Text(DayOfWeek,NARROW)"}, 704 705 {"e", "Localized(DayOfWeek,1)"}, 706 {"ee", "Localized(DayOfWeek,2)"}, 707 {"eee", "Text(DayOfWeek,SHORT)"}, 708 {"eeee", "Text(DayOfWeek)"}, 709 {"eeeee", "Text(DayOfWeek,NARROW)"}, 710 711 {"c", "Localized(DayOfWeek,1)"}, 712 {"ccc", "Text(DayOfWeek,SHORT_STANDALONE)"}, 713 {"cccc", "Text(DayOfWeek,FULL_STANDALONE)"}, 714 {"ccccc", "Text(DayOfWeek,NARROW_STANDALONE)"}, 715 716 {"a", "Text(AmPmOfDay,SHORT)"}, 717 718 {"H", "Value(HourOfDay)"}, 719 {"HH", "Value(HourOfDay,2)"}, 720 721 {"K", "Value(HourOfAmPm)"}, 722 {"KK", "Value(HourOfAmPm,2)"}, 723 724 {"k", "Value(ClockHourOfDay)"}, 725 {"kk", "Value(ClockHourOfDay,2)"}, 726 727 {"h", "Value(ClockHourOfAmPm)"}, 728 {"hh", "Value(ClockHourOfAmPm,2)"}, 729 730 {"m", "Value(MinuteOfHour)"}, 731 {"mm", "Value(MinuteOfHour,2)"}, 732 733 {"s", "Value(SecondOfMinute)"}, 734 {"ss", "Value(SecondOfMinute,2)"}, 735 736 {"S", "Fraction(NanoOfSecond,1,1)"}, 737 {"SS", "Fraction(NanoOfSecond,2,2)"}, 738 {"SSS", "Fraction(NanoOfSecond,3,3)"}, 739 {"SSSSSSSSS", "Fraction(NanoOfSecond,9,9)"}, 740 741 {"A", "Value(MilliOfDay)"}, 742 {"AA", "Value(MilliOfDay,2)"}, 743 {"AAA", "Value(MilliOfDay,3)"}, 744 745 {"n", "Value(NanoOfSecond)"}, 746 {"nn", "Value(NanoOfSecond,2)"}, 747 {"nnn", "Value(NanoOfSecond,3)"}, 748 749 {"N", "Value(NanoOfDay)"}, 750 {"NN", "Value(NanoOfDay,2)"}, 751 {"NNN", "Value(NanoOfDay,3)"}, 752 753 {"z", "ZoneText(SHORT)"}, 754 {"zz", "ZoneText(SHORT)"}, 759 760 {"Z", "Offset(+HHMM,'+0000')"}, // SimpleDateFormat 761 {"ZZ", "Offset(+HHMM,'+0000')"}, // SimpleDateFormat 762 {"ZZZ", "Offset(+HHMM,'+0000')"}, // SimpleDateFormat 763 764 {"X", "Offset(+HHmm,'Z')"}, // LDML/almost SimpleDateFormat 765 {"XX", "Offset(+HHMM,'Z')"}, // LDML/SimpleDateFormat 766 {"XXX", "Offset(+HH:MM,'Z')"}, // LDML/SimpleDateFormat 767 {"XXXX", "Offset(+HHMMss,'Z')"}, // LDML 768 {"XXXXX", "Offset(+HH:MM:ss,'Z')"}, // LDML 769 770 {"x", "Offset(+HHmm,'+00')"}, // LDML 771 {"xx", "Offset(+HHMM,'+0000')"}, // LDML 772 {"xxx", "Offset(+HH:MM,'+00:00')"}, // LDML 773 {"xxxx", "Offset(+HHMMss,'+0000')"}, // LDML 774 {"xxxxx", "Offset(+HH:MM:ss,'+00:00')"}, // LDML 775 776 {"ppH", "Pad(Value(HourOfDay),2)"}, 777 {"pppDD", "Pad(Value(DayOfYear,2),3)"}, 778 779 {"yyyy[-MM[-dd", "Value(YearOfEra,4,19,EXCEEDS_PAD)['-'Value(MonthOfYear,2)['-'Value(DayOfMonth,2)]]"}, 780 {"yyyy[-MM[-dd]]", "Value(YearOfEra,4,19,EXCEEDS_PAD)['-'Value(MonthOfYear,2)['-'Value(DayOfMonth,2)]]"}, 781 {"yyyy[-MM[]-dd]", "Value(YearOfEra,4,19,EXCEEDS_PAD)['-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)]"}, 782 783 {"yyyy-MM-dd'T'HH:mm:ss.SSS", "Value(YearOfEra,4,19,EXCEEDS_PAD)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)" + 784 "'T'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)'.'Fraction(NanoOfSecond,3,3)"}, 785 786 {"w", "Localized(WeekOfWeekBasedYear,1)"}, 787 {"ww", "Localized(WeekOfWeekBasedYear,2)"}, 788 {"W", "Localized(WeekOfMonth,1)"}, 789 }; 790 } 791 792 @Test(dataProvider="validPatterns") 793 public void test_appendPattern_valid(String input, String expected) throws Exception { 794 builder.appendPattern(input); 795 DateTimeFormatter f = builder.toFormatter(); 796 assertEquals(f.toString(), expected); 797 } 798 799 //----------------------------------------------------------------------- 800 @DataProvider(name="invalidPatterns") 801 Object[][] dataInvalid() { 802 return new Object[][] { 803 {"'"}, 804 {"'hello"}, 805 {"'hel''lo"}, 806 {"'hello''"}, 807 {"{"}, 808 {"}"}, 809 {"{}"}, 810 {"]"}, 811 {"yyyy]"}, 812 {"yyyy]MM"}, 813 {"yyyy[MM]]"}, 814 815 {"aa"}, 816 {"aaa"}, 817 {"aaaa"}, 818 {"aaaaa"}, 819 {"aaaaaa"}, 820 {"MMMMMM"}, 821 {"LLLLLL"}, 822 {"QQQQQQ"}, 823 {"qqqqqq"}, 824 {"EEEEEE"}, 825 {"eeeeee"}, 826 {"cc"}, 827 {"cccccc"}, 828 {"ddd"}, 829 {"DDDD"}, 830 {"FF"}, 831 {"FFF"}, 832 {"hhh"}, 833 {"HHH"}, 834 {"kkk"}, 835 {"KKK"}, 836 {"mmm"}, 837 {"sss"}, 838 {"OO"}, 839 {"OOO"}, 840 {"OOOOO"}, 841 {"XXXXXX"}, 842 {"ZZZZZZ"}, 843 {"zzzzz"}, 844 {"V"}, 845 {"VVV"}, 846 {"VVVV"}, 847 {"VVVVV"}, 848 849 {"RO"}, 850 851 {"p"}, 852 {"pp"}, 853 {"p:"}, 854 855 {"f"}, 856 {"ff"}, 857 {"f:"}, 858 {"fy"}, 859 {"fa"}, 860 {"fM"}, 861 862 {"www"}, 863 {"WW"}, 864 }; 865 } 866 867 @Test(dataProvider="invalidPatterns", expectedExceptions=IllegalArgumentException.class) 868 public void test_appendPattern_invalid(String input) throws Exception { 869 try { 870 builder.appendPattern(input); 871 } catch (IllegalArgumentException ex) { 872 throw ex; 873 } 874 } 875 876 //----------------------------------------------------------------------- 877 @DataProvider(name="patternPrint") 878 Object[][] data_patternPrint() { 879 return new Object[][] { 880 {"Q", date(2012, 2, 10), "1"}, 881 {"QQ", date(2012, 2, 10), "01"}, 882 {"QQQ", date(2012, 2, 10), "Q1"}, 883 {"QQQQ", date(2012, 2, 10), "1st quarter"}, 884 {"QQQQQ", date(2012, 2, 10), "1"}, 885 }; 886 } 887 888 @Test(dataProvider="patternPrint") 889 public void test_appendPattern_patternPrint(String input, Temporal temporal, String expected) throws Exception { 890 DateTimeFormatter f = builder.appendPattern(input).toFormatter(Locale.UK); 891 String test = f.format(temporal); 892 assertEquals(test, expected); 893 } 894 895 private static Temporal date(int y, int m, int d) { 896 return LocalDate.of(y, m, d); 897 } 898 899 } |