Создание, анализ ирефакторинг
Скачать 3.16 Mb.
|
405 739 return SerialDate.createInstance(last, base.getMonth(), base.getYYYY()); 740 } 741 742 /** 743 * Возвращает строку, соответствующую коду недели в месяце. 744 * 745 * Необходимо поискать более элегантное решение. 746 * 747 * @param count целочисленный код недели в месяце. 748 * 749 * @return строка, соответствующая коду недели в месяце. 750 */ 751 public static String weekInMonthToString(final int count) { 752 753 switch (count) { 754 case SerialDate.FIRST_WEEK_IN_MONTH : return "First"; 755 case SerialDate.SECOND_WEEK_IN_MONTH : return "Second"; 756 case SerialDate.THIRD_WEEK_IN_MONTH : return "Third"; 757 case SerialDate.FOURTH_WEEK_IN_MONTH : return "Fourth"; 758 case SerialDate.LAST_WEEK_IN_MONTH : return "Last"; 759 default : 760 return "SerialDate.weekInMonthToString(): invalid code."; 761 } 762 763 } 764 765 /** 766 * Возвращает строку, представляющую переданное значение relative. 767 * 768 * Необходимо поискать более элегантное решение. 769 * 770 * @param relative константа, представляющая значение’relative’. 771 * 772 * @return строка, представляющая переданное значение ‘relative’. 773 */ 774 public static String relativeToString(final int relative) { 775 776 switch (relative) { 777 case SerialDate.PRECEDING : return "Preceding"; 778 case SerialDate.NEAREST : return "Nearest"; 779 case SerialDate.FOLLOWING : return "Following"; 780 default : return "ERROR : Relative To String"; 781 } 782 783 } 784 785 /** 786 * Метод-фабрика, возвращающий экземпляр конкретного субкласса 787 * {@link SerialDate}. 788 * продолжение 405 406 Приложение Б . org.jfree.date.SerialDate листинг Б .1 (продолжение) 789 * @param day день (1-31). 790 * @param month месяц (1-12). 791 * @param yyyy год (в диапазоне от 1900 до 9999). 792 * 793 * @return Экземпляр {@link SerialDate}. 794 */ 795 public static SerialDate createInstance(final int day, final int month, 796 final int yyyy) { 797 return new SpreadsheetDate(day, month, yyyy); 798 } 799 800 /** 801 * Метод-фабрика, возвращающий экземпляр конкретного субкласса 802 * {@link SerialDate}. 803 * 804 * @param serial порядковый номер дня (1 января 1900 = 2). 805 * 806 * @return экземпляр SerialDate. 807 */ 808 public static SerialDate createInstance(final int serial) { 809 return new SpreadsheetDate(serial); 810 } 811 812 /** 813 * Метод-фабрика, возвращающий экземпляр субкласса SerialDate. 814 * 815 * @param date объект даты Java. 816 * 817 * @return экземпляр SerialDate. 818 */ 819 public static SerialDate createInstance(final java.util.Date date) { 820 821 final GregorianCalendar calendar = new GregorianCalendar(); 822 calendar.setTime(date); 823 return new SpreadsheetDate(calendar.get(Calendar.DATE), 824 calendar.get(Calendar.MONTH) + 1, 825 calendar.get(Calendar.YEAR)); 826 827 } 828 829 /** 830 * Возвращает порядковый номер для даты, где 1 January 1900 = 2 (что почти 831 * соответствует системе нумерации, используемой в Microsoft Excel for 832 * Windows и Lotus 1-2-3). 833 * 834 * @return порядковый номер даты. 835 */ 836 public abstract int toSerial(); 837 838 /** 406 org.jfree.date.SerialDate 407 839 * Возвращает java.util.Date. Поскольку java.util.Date превосходит SerialDate 840 * по точности, необходимо определить схему выбора ‘времени суток’. 841 * 842 * @return текущий объект в виде java.util.Date .843 */ 844 public abstract java.util.Date toDate(); 845 846 /** 847 * Возвращает описание даты. 848 * 849 * @return описание даты. 850 */ 851 public String getDescription() { 852 return this.description; 853 } 854 855 /** 856 * Задает описание даты. 857 * 858 * @param description новое описание даты. 859 */ 860 public void setDescription(final String description) { 861 this.description = description; 862 } 863 864 /** 865 * Преобразует дату в строку. 866 * 867 * @return строковое представление даты. 868 */ 869 public String toString() { 870 return getDayOfMonth() + "-" + SerialDate.monthCodeToString(getMonth()) 871 + "-" + getYYYY(); 872 } 873 874 /** 875 * Возвращает год (в действительном диапазоне от 1900 до 9999). 876 * 877 * @return год. 878 */ 879 public abstract int getYYYY(); 880 881 /** 882 * Возвращает месяц (январь = 1, февраль = 2, март = 3). 883 * 884 * @return месяц. 885 */ 886 public abstract int getMonth(); 887 888 /** продолжение 407 408 Приложение Б . org.jfree.date.SerialDate листинг Б .1 (продолжение) 889 * Возвращает день месяца. 890 * 891 * @return день месяца. 892 */ 893 public abstract int getDayOfMonth(); 894 895 /** 896 * Возвращает день недели. 897 * 898 * @return день недели. 899 */ 900 public abstract int getDayOfWeek(); 901 902 /** 903 * Возвращает разность (в днях) между текущей и заданной 904 * 'другой' датой. 905 * 906 * Результат положительный, если текущая дата следует после 'другой', 907 * или отрицателен, если текущая дата предшествует 'другой'. 908 * 909 * @param other дата для сравнения. 910 * 911 * @return разность между текущей и другой датой. 912 */ 913 public abstract int compare(SerialDate other); 914 915 /** 916 * Возвращает true, если текущий объект SerialDate представляет ту же дату, 917 * что и заданный объект SerialDate. 918 * 919 * @param other дата для сравнения. 920 * 921 * @return true , если текущий объект SerialDate представляет922 * ту же дату, что и заданный объект SerialDate. 923 */ 924 public abstract boolean isOn(SerialDate other); 925 926 /** 927 * Возвращает true, если текущий объект SerialDate представляет более раннюю 928 * дату по сравнению с заданным объектом SerialDate. 929 * 930 * @param other дата для сравнения. 931 * 932 * @return true , если текущий объект SerialDate представляет933 * более раннюю дату по сравнению с заданным объектом SerialDate. 934 */ 935 public abstract boolean isBefore(SerialDate other); 936 937 /** 938 * Возвращает true, если текущий объект SerialDate представляет ту же 408 org.jfree.date.SerialDate 409 939 * дату, что и заданный объект SerialDate. 940 * 941 * @param other дата для сравнения. 942 * 943 * @return true 410 Приложение Б . org.jfree.date.SerialDate листинг Б .1 (продолжение) 989 * @param include код, управляющий включением начальной и конечной дат 990 * в диапазон. 991 * 992 * @return Логический признак. 993 */ 994 public abstract boolean isInRange(SerialDate d1, SerialDate d2, 995 int include); 996 997 /** 998 * Возвращает последнюю дату, приходящуюся на заданный день недели, 999 * ПРЕДШЕСТВУЮЩУЮ текущей дате. 1000 * 1001 * @param targetDOW код дня недели. 1002 * 1003 * @return последняя дата, приходящаяся на заданный день недели, 1004 * ПРЕДШЕСТВУЮЩАЯ текущей дате. 1005 */ 1006 public SerialDate getPreviousDayOfWeek(final int targetDOW) { 1007 return getPreviousDayOfWeek(targetDOW, this); 1008 } 1009 1010 /** 1011 * Возвращает самую раннюю дату, приходящуюся на заданный день недели, 1012 * ПОСЛЕ текущей даты. 1013 * 1014 * @param targetDOW код дня недели. 1015 * 1016 * @return самая ранняя дата, приходящаяся на заданный день недели 1017 * ПОСЛЕ текущей даты. 1018 */ 1019 public SerialDate getFollowingDayOfWeek(final int targetDOW) { 1020 return getFollowingDayOfWeek(targetDOW, this); 1021 } 1022 1023 /** 1024 * Возвращает ближайшую дату, приходящуюся на заданный день недели, 1025 * 1026 * @param targetDOW код дня недели. 1027 * 1028 * @return ближайшая дата, приходящаяся на заданный день недели, 1029 */ 1030 public SerialDate getNearestDayOfWeek(final int targetDOW) { 1031 return getNearestDayOfWeek(targetDOW, this); 1032 } 1033 1034 } 410 org.jfree.date.SerialDate 411 листинг Б .2 . SerialDateTest.java 1 /* ======================================================================== 2 * JCommon : библиотека классов общего назначения для платформы Java(tm) 3 * ======================================================================== 4 * 5 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. 6 * 7 * Информация о проекте: http://www.jfree.org/jcommon/index.html 8 * 9 * Библиотека распространяется бесплатно; вы можете свободно распространять 10 * и/или изменять ее на условиях лицензии Lesser General Public License 11 * в формулировке Free Software Foundation; либо версии 2.1 лицензии, либо 12 * (на ваше усмотрение) любой последующей версии. 13 * 14 * Библиотека распространяется в надежде, что она будет полезна, но 15 * БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, даже без подразумеваемой гарантии ПРИГОДНОСТИ 16 * для КОНКРЕТНОЙ ЦЕЛИ. За подробностями обращайтесь к GNU Lesser General 17 * Public License. 18 * 19 * Вы должны получить копию лицензии GNU Lesser General Public License 20 * с этой библиотекой; если этого не произошло, обратитесь в Free Software 21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 22 * USA. 23 * 24 * [Java является зарегистрированной торговой маркой Sun Microsystems, Inc. 25 * в Соединенных Штатах и других странах]. 26 * 27 * -------------------- 28 * SerialDateTests.java 29 * -------------------- 30 * (C) Copyright 2001-2005, by Object Refinery Limited. 31 * 32 * Автор: Дэвид Гилберт (для Object Refinery Limited); 33 * Участники: -; 34 * 35 * $Id: SerialDateTests.java,v 1.6 2005/11/16 15:58:40 taqua Exp $ 36 * 37 * Изменения 38 * -------------------------- 39 * 15.12.2001 : Версия 1 (DG); 40 * 25.06.2002 : Удаление лишнего импорта (DG); 41 * 24.10.2002 : Исправление ошибок по информации Checkstyle (DG); 42 * 13.03.2003 : Добавление теста сериализации (DG); 43 * 05.01.2005 : Добавление теста для ошибки по отчету 1096282 (DG); 44 * 45 */ 46 47 package org.jfree.date.junit; 48 49 import java.io.ByteArrayInputStream; 50 import java.io.ByteArrayOutputStream; продолжение 411 412 Приложение Б . org.jfree.date.SerialDate листинг Б .2 (продолжение) 51 import java.io.ObjectInput; 52 import java.io.ObjectInputStream; 53 import java.io.ObjectOutput; 54 import java.io.ObjectOutputStream; 55 56 import junit.framework.Test; 57 import junit.framework.TestCase; 58 import junit.framework.TestSuite; 59 60 import org.jfree.date.MonthConstants; 61 import org.jfree.date.SerialDate; 62 63 /** 64 * Тесты JUnit для класса {@link SerialDate}. 65 */ 66 public class SerialDateTests extends TestCase { 67 68 /** Дата, представляющая 9 ноября. */ 69 private SerialDate nov9Y2001; 70 71 /** 72 * Создает новый тестовый сценарий. 73 * 74 * @param name the name. 75 */ 76 public SerialDateTests(final String name) { 77 super(name); 78 } 79 80 /** 81 * Возвращает пакет тестов для системы запуска тестов JUnit. 82 * 83 * @return тестовый пакет. 84 */ 85 public static Test suite() { 86 return new TestSuite(SerialDateTests.class); 87 } 88 89 /** 90 * Подготовка задачи. 91 */ 92 protected void setUp() { 93 this.nov9Y2001 = SerialDate.createInstance(9, MonthConstants.NOVEMBER, 2001); 94 } 95 96 /** 97 * 9 ноября 2001 + 2 месяца = должно быть 9 января 2002. 98 */ 99 public void testAddMonthsTo9Nov2001() { 100 final SerialDate jan9Y2002 = SerialDate.addMonths(2, this.nov9Y2001); 101 final SerialDate answer = SerialDate.createInstance(9, 1, 2002); 412 org.jfree.date.SerialDate 413 102 assertEquals(answer, jan9Y2002); 103 } 104 105 /** 106 * Тестовый сценарий для известной ошибки (исправлено). 107 */ 108 public void testAddMonthsTo5Oct2003() { 109 final SerialDate d1 = SerialDate.createInstance(5, MonthConstants.OCTOBER, 2003); 110 final SerialDate d2 = SerialDate.addMonths(2, d1); 111 assertEquals(d2, SerialDate.createInstance(5, MonthConstants.DECEMBER, 2003)); 112 } 113 114 /** 115 * Тестовый сценарий для известной ошибки (исправлено). 116 */ 117 public void testAddMonthsTo1Jan2003() { 118 final SerialDate d1 = SerialDate.createInstance(1, MonthConstants.JANUARY, 2003); 119 final SerialDate d2 = SerialDate.addMonths(0, d1); 120 assertEquals(d2, d1); 121 } 122 123 /** 124 * Понедельник, предшествующий 9 ноября 2001, - должно быть 5 ноября. 125 */ 126 public void testMondayPrecedingFriday9Nov2001() { 127 SerialDate mondayBefore = SerialDate.getPreviousDayOfWeek( 128 SerialDate.MONDAY, this.nov9Y2001 129 ); 130 assertEquals(5, mondayBefore.getDayOfMonth()); 131 } 132 133 /** 134 * Понедельник, следующий за 9 ноября 2001, - должно быть 12 ноября. 135 */ 136 public void testMondayFollowingFriday9Nov2001() { 137 SerialDate mondayAfter = SerialDate.getFollowingDayOfWeek( 138 SerialDate.MONDAY, this.nov9Y2001 139 ); 140 assertEquals(12, mondayAfter.getDayOfMonth()); 141 } 142 143 /** 144 * Понедельник, ближайший к 9 ноября 2001, - должно быть 12 ноября. 145 */ 146 public void testMondayNearestFriday9Nov2001() { 147 SerialDate mondayNearest = SerialDate.getNearestDayOfWeek( 148 SerialDate.MONDAY, this.nov9Y2001 149 ); 150 assertEquals(12, mondayNearest.getDayOfMonth()); продолжение 413 414 Приложение Б . org.jfree.date.SerialDate листинг Б .2 (продолжение)x 151 } 152 153 /** 154 * Понедельник, ближайший к 22 января 1970, - должно быть 19-е января. 155 */ 156 public void testMondayNearest22Jan1970() { 157 SerialDate jan22Y1970 = SerialDate.createInstance(22, MonthConstants.JANUARY, 1970); 158 SerialDate mondayNearest=SerialDate.getNearestDayOfWeek(SerialDate.MONDAY, jan22Y1970); 159 assertEquals(19, mondayNearest.getDayOfMonth()); 160 } 161 162 /** 163 * Проверяет преобразование дней в строки. На самом деле результат 164 * зависит от локального контекста, так что тест следует изменить. 165 */ 166 public void testWeekdayCodeToString() { 167 168 final String test = SerialDate.weekdayCodeToString(SerialDate.SATURDAY); 169 assertEquals("Saturday", test); 170 171 } 172 173 /** 174 * Проверяет преобразование строки в день недели. Если в локальном контексте 175 * не используются английские названия дней недели, тест не пройдет (улучшить)! 176 */ 177 public void testStringToWeekday() { 178 179 int weekday = SerialDate.stringToWeekdayCode("Wednesday"); 180 assertEquals(SerialDate.WEDNESDAY, weekday); 181 182 weekday = SerialDate.stringToWeekdayCode(" Wednesday "); 183 assertEquals(SerialDate.WEDNESDAY, weekday); 184 185 weekday = SerialDate.stringToWeekdayCode("Wed"); 186 assertEquals(SerialDate.WEDNESDAY, weekday); 187 188 } 189 190 /** 191 * Проверяет преобразование строки в месяц. Если в локальном контексте 192 * не используются английские названия месяцев, тест не пройдет (улучшить)! 193 */ 194 public void testStringToMonthCode() { 195 196 int m = SerialDate.stringToMonthCode("January"); 197 assertEquals(MonthConstants.JANUARY, m); 198 199 m = SerialDate.stringToMonthCode(" January "); 414 org.jfree.date.SerialDate 415 200 assertEquals(MonthConstants.JANUARY, m); 201 202 m = SerialDate.stringToMonthCode("Jan"); 203 assertEquals(MonthConstants.JANUARY, m); 204 205 } 206 207 /** 208 * Проверяет преобразование кода месяца в строку. 209 */ 210 public void testMonthCodeToStringCode() { 211 212 final String test = SerialDate.monthCodeToString(MonthConstants.DECEMBER); 213 assertEquals("December", test); 214 215 } 216 217 /** 218 * Год 1900 не является високосным. 219 */ 220 public void testIsNotLeapYear1900() { 221 assertTrue(!SerialDate.isLeapYear(1900)); 222 } 223 224 /** 225 * Год 2000 - високосный. 226 */ 227 public void testIsLeapYear2000() { 228 assertTrue(SerialDate.isLeapYear(2000)); 229 } 230 231 /** 232 * Количество високосных годов с 1900 до 1899 включительно равно 0. 233 */ 234 public void testLeapYearCount1899() { 235 assertEquals(SerialDate.leapYearCount(1899), 0); 236 } 237 238 /** 239 * Количество високосных годов с 1900 до 1903 включительно равно 0. 240 */ 241 public void testLeapYearCount1903() { 242 assertEquals(SerialDate.leapYearCount(1903), 0); 243 } 244 245 /** 246 * Количество високосных годов с 1900 до 1904 включительно равно 1. 247 */ 248 public void testLeapYearCount1904() { 249 assertEquals(SerialDate.leapYearCount(1904), 1); 250 } 251 252 /** продолжение 415 |