package I3.Clocks;

public class Clock {
	public static final int HOURS_PER_DAY = 24;
	public static final int MINUTES_PER_HOUR = 60;
        
        private int hour, 
		    minute;
        
	public int hour () {return hour;}
	public int minute () {return minute;}
        
	public static boolean isValidTime (int hour, int minute)
        {
            return
		0 <= hour && hour < HOURS_PER_DAY &&
		0 <= minute && minute < MINUTES_PER_HOUR;
	}
        
	public void set (int hour, int minute)
        {
            assert isValidTime(hour, minute) : "precondition";
            this.hour	= hour;
            this.minute	= minute;
            assert isValidTime(this.hour, this.minute) : "invariant";
	}
        
	public void tick ()
        {
            assert isValidTime(hour, minute) : "invariant";
            minute = (minute + 1) % MINUTES_PER_HOUR;
            if (minute == 0) {
		hour = (hour + 1) % HOURS_PER_DAY;
            }
            assert isValidTime(hour, minute) : "invariant";
	}
} // end of Clock
