기 ¶
¶
public class TimeInfo {
private static final int BLANK = 1;
private int[] days= {31,28,31,30,31,30,31,31,30,31,30,31};
private String[] dayNames= {
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
};
public int getDaysInMonth(int month) {
if(!isProperMonth(BLANK, month))
return 0;
return days[month-1];
}
public int getDaysInYearMonth(int year, int month) {
if(!isProperMonth(year, month))
return 0;
if(month==2 && isSpecialYear(year)) {
return getDaysInMonth(month)+1;
}
return getDaysInMonth(month);
}
/*
* 기?
* 4 100 .
* 400 .
*/
private boolean isSpecialYear(int year) {
if(year%400==0)
return true;
if(year%4==0 && year%100!=0)
return true;
return false;
}
public int getDaysInYear(int year) {
if(!isProperMonth(year, BLANK))
return 0;
if(isSpecialYear(year)) {
return 365 + 1;
}
return 365;
}
private boolean isProperMonth(int year, int month) {
return ( year > 0 ) && ( 0 < month && month <= 12 );
}
private boolean isProperDate(int year, int month, int day) {
return ( year > 0 ) && ( 0 < month && month <= 12 )
&& ( 0 < day && day <= getDaysInYearMonth(year, month) );
}
public String getDayName(int year, int month, int day) {
if(!isProperDate(year, month, day))
return "";
int reducedDays= getTotalDaysUntil(year, month, day)%dayNames.length;
return getDayName(reducedDays);
}
private String getDayName(int sequence) {
return dayNames[sequence];
}
public int getTotalDaysUntil(int year, int month, int day) {
if(!isProperDate(year, month, day))
return 0;
int totalDays= 0;
for(int i=1;i<year;i++) {
totalDays += getDaysInYear(i);
}
for(int i=1;i<month;i++) {
totalDays += getDaysInYearMonth(year, i);
}
totalDays += day;
return totalDays;
}
public String[] getDayNames() {
return dayNames;
}
}
public class CalendarMaker {
String[] names= {};
int startIndex= 0;
private boolean isReady= false;
private String space= " ";
public void setForm(String[] dayNames, String space) {
names= dayNames;
this.space= space;
}
public void setMonth(int year, int month, String startName) {
startIndex= -1;
for(int i=0;i<names.length;i++) {
if(startName.equals(names[i])) {
startIndex= i;
}
}
if(names != null && startIndex != -1)
isReady= true;
}
public String getResult(int start, int end) {
if(!isReady()) {
return "";
}
StringWriter sw= new StringWriter();
sw.write(repeatString(" "+space, startIndex));
for(int i=start;i<=end;i++) {
sw.write(String.valueOf(i)+space);
if((startIndex + i)%names.length==0) {
sw.write("\n");
}
}
return sw.toString();
}
public String getNames(int length) {
StringWriter sw= new StringWriter();
for(String name : names) {
sw.write(name.substring(0, length) + "\t");
}
return sw.toString();
}
private boolean isReady() {
return isReady;
}
private String repeatString(String string, int repeat) {
if(repeat == 0)
return "";
return string + repeatString(string, repeat-1);
}
public static void main(String[] args) throws Exception{
TimeInfo timeInfo= new TimeInfo();
CalendarMaker maker= new CalendarMaker();
int year= 0;
int month= 0;
System.out.println("input year, month");
Scanner input= new Scanner(System.in);
year= input.nextInt();
month= input.nextInt();
String startDay= timeInfo.getDayName(year, month, 1);
maker.setForm(timeInfo.getDayNames(), "\t");
maker.setMonth(year, month, startDay);
System.out.println(maker.getNames(4));
System.out.println(maker.getResult(1, timeInfo.getDaysInYearMonth(year, month)));
}
}
¶
public class TestCalendar extends TestCase{
TimeInfo timeInfo= new TimeInfo();
CalendarMaker maker= new CalendarMaker();
public void setUp() throws Exception {
timeInfo= new TimeInfo();
maker= new CalendarMaker();
}
public void testDayCount() {
assertEquals(31, timeInfo.getDaysInMonth(1));
assertEquals(28, timeInfo.getDaysInMonth(2));
assertEquals(31, timeInfo.getDaysInMonth(12));
assertEquals(0, timeInfo.getDaysInMonth(0));
assertEquals(0, timeInfo.getDaysInMonth(13));
}
public void testActualDaycount() {
assertEquals(28, timeInfo.getDaysInYearMonth(1999, 2));
assertEquals(29, timeInfo.getDaysInYearMonth(2004, 2));
assertEquals(28, timeInfo.getDaysInYearMonth(2100, 2));
assertEquals(0, timeInfo.getDaysInYearMonth(0, 2));
assertEquals(0, timeInfo.getDaysInYearMonth(2000, 13));
}
public void testAcutalDayCountInYear() {
assertEquals(365, timeInfo.getDaysInYear(2003));
assertEquals(366, timeInfo.getDaysInYear(2000));
assertEquals(0, timeInfo.getDaysInYear(0));
}
public void testTotalDays() {
assertEquals(1, timeInfo.getTotalDaysUntil(1,1,1));
assertEquals(365, timeInfo.getTotalDaysUntil(1,12,31));
assertEquals(365*2, timeInfo.getTotalDaysUntil(2,12,31));
assertEquals(365*4+1, timeInfo.getTotalDaysUntil(4,12,31));
}
public void testDayName() {
assertEquals("Monday", timeInfo.getDayName(1,1,1));
assertEquals("Sunday", timeInfo.getDayName(1,1,14));
assertEquals("Thursday", timeInfo.getDayName(2007,4,26));
assertEquals("", timeInfo.getDayName(2000,2,30));
assertEquals("", timeInfo.getDayName(2007,4,32));
}
public void testInitialMaker() {
CalendarMaker maker= new CalendarMaker();
maker.setForm(timeInfo.getDayNames(), " ");
assertEquals("", maker.getResult(1,4));
}
public void testMakingCarendar() {
maker.setForm(timeInfo.getDayNames(), " ");
maker.setMonth(1,1,"Monday");
String result= maker.getResult(1,4);
result.replaceAll("\t", " ");
assertEquals(" 1 2 3 4 ", result);
assertEquals(" 1 2 3 4 5 6 \n7 8 9 10 11 12 13 \n", maker.getResult(1,13));
}
}










