Coverage Report - br.org.agilcoop.cursos.testes.unidade.timer.Timer
 
Classes in this File Line Coverage Branch Coverage Complexity
Timer
0%
0/65
0%
0/32
0
Timer$1
0%
0/4
N/A
0
Timer$SleepingThread
0%
0/13
0%
0/2
0
Timer$TimerState
0%
0/8
N/A
0
 
 1  0
 package br.org.agilcoop.cursos.testes.unidade.timer;
 2  
 
 3  
 import java.util.ArrayList;
 4  
 import java.util.List;
 5  
 
 6  
 public class Timer {
 7  0
         public enum TimerState {
 8  0
                 RUNNING(1),
 9  0
                 STOPPED(2),
 10  0
                 FINISHED(3);
 11  
                 
 12  
                 int state;
 13  
 
 14  0
                 private TimerState(int state) {
 15  0
                         this.state = state;
 16  0
                 }
 17  
         }
 18  
         
 19  
         @SuppressWarnings("unused")
 20  
         private class SleepingThread extends Thread {
 21  
                 private long startTime;
 22  
                 private long sleepTime;
 23  
                 private long elapsedTime;
 24  
                 
 25  0
                 private SleepingThread(long sleepTime) {
 26  0
                         this.sleepTime = sleepTime;
 27  0
                 }
 28  
 
 29  
                 public void run() {
 30  0
                         startTime = System.currentTimeMillis();
 31  
                         try {
 32  0
                                 Thread.sleep(sleepTime);
 33  0
                                 elapsedTime = sleepTime;
 34  
                                 // Parent
 35  0
                                 finalizou();
 36  0
                         } catch (InterruptedException e) {
 37  0
                                 elapsedTime = System.currentTimeMillis() - startTime;
 38  
                         }
 39  0
                 }
 40  
                 
 41  
                 public long elapsed() {
 42  0
                         if(isAlive()) 
 43  0
                                 return System.currentTimeMillis() - startTime;
 44  0
                         return elapsedTime;
 45  
                 }
 46  
 
 47  
         }
 48  
         
 49  
         private long totalInMiliseconds;
 50  0
         private TimerState state = TimerState.STOPPED;
 51  
         private SleepingThread thread;
 52  
         private long elapsed;
 53  0
         private final List<Event> events = new ArrayList<Event>();
 54  
         
 55  0
         public Timer(int hours, int minutes, int seconds) {
 56  0
                 if(hours < 0 || minutes < 0 || seconds < 0)
 57  0
                         throw new IllegalArgumentException("must be positive");
 58  0
                 adjust(hours, minutes, seconds);
 59  0
         }
 60  
         
 61  
         public Timer() {
 62  0
                 this(0, 0, 0);
 63  0
         }
 64  
         
 65  
         public void adjust(int hours, int minutes, int seconds) {
 66  0
                 long totalInSeconds = metodoDaRefatoracao(hours, minutes, seconds);
 67  0
                 totalInMiliseconds = totalInSeconds * 1000;
 68  0
                 stop();
 69  0
         }
 70  
         
 71  
         public long metodoDaRefatoracao(int hours, int minutes, int seconds) {
 72  0
                 return (hours * 3600) + (minutes * 60) + seconds;
 73  
         }
 74  
         
 75  0
         private void finalizou() {
 76  0
                 state = TimerState.FINISHED;
 77  0
                 elapsed = totalInMiliseconds;
 78  0
                 for (final Event event : events) {
 79  0
                         final Timer timer = this;
 80  
                         try {
 81  0
                                 new Thread(new Runnable() {
 82  
                                         public void run() {
 83  0
                                                 event.executa(timer);
 84  0
                                         }
 85  0
                                 }).start();
 86  0
                         } catch(Exception e) {
 87  0
                                 e.printStackTrace();
 88  
                         }
 89  
                 }
 90  0
         }
 91  
 
 92  
         synchronized public void start() {
 93  0
                 if(state == TimerState.STOPPED) {
 94  0
                         state = TimerState.RUNNING;
 95  0
                         thread = new SleepingThread(totalInMiliseconds - elapsed);
 96  0
                         thread.start();
 97  
                 }
 98  0
         }
 99  
         
 100  
         synchronized public void pause() {
 101  0
                 if(state == TimerState.RUNNING) {
 102  0
                         state = TimerState.STOPPED;
 103  0
                         elapsed += thread.elapsed();
 104  0
                         thread.interrupt();
 105  
                 }
 106  0
         }
 107  
         
 108  
         synchronized public void stop() {
 109  0
                 if(state == TimerState.RUNNING) thread.interrupt();
 110  0
                 state = TimerState.STOPPED;
 111  0
                 elapsed = 0;
 112  0
         }
 113  
         
 114  
         public long total() {
 115  0
                 return totalInMiliseconds;
 116  
         }
 117  
         
 118  
         public synchronized long elapsed() {
 119  0
                 if(state == TimerState.RUNNING)
 120  0
                         return elapsed + thread.elapsed();
 121  
                 else
 122  0
                         return elapsed;
 123  
         }
 124  
         
 125  
         public String elapsedFormatted() {
 126  0
                 return timerDefaultFormat((int) elapsed() / 1000);
 127  
         }
 128  
         
 129  
         public String totalFormatted() {
 130  0
                 return timerDefaultFormat((int) total() / 1000);
 131  
         }
 132  
         
 133  
         public static String timerDefaultFormat(int totalOfSeconds) {
 134  0
                 int hours = totalOfSeconds / 3600;
 135  0
                 int minutes = (totalOfSeconds % 3600) / 60;
 136  0
                 int seconds = (totalOfSeconds % 3600) % 60;
 137  0
                 StringBuilder builder = new StringBuilder();
 138  0
                 if(hours < 10) builder.append("0");
 139  0
                 builder.append(hours + ":");
 140  0
                 if(minutes < 10) builder.append("0");
 141  0
                 builder.append(minutes + ":");
 142  0
                 if(seconds < 10) builder.append("0");
 143  0
                 builder.append(seconds);
 144  0
                 return builder.toString();
 145  
         }
 146  
         
 147  
         public TimerState state() {
 148  0
                 return state;
 149  
         }
 150  
 
 151  
         public boolean running() {
 152  0
                 return state == TimerState.RUNNING;
 153  
         }
 154  
 
 155  
         public boolean stopped() {
 156  0
                 return ! running();
 157  
         }
 158  
         
 159  
         public boolean finished() {
 160  0
                 return state == TimerState.FINISHED;
 161  
         }
 162  
         
 163  
         public void addEvent(Event event) {
 164  0
                 if(event != null)
 165  0
                         events.add(event);
 166  0
         }
 167  
         
 168  
         public void removeEvent(Event event) {
 169  0
                 if(event != null)
 170  0
                         events.remove(event);
 171  0
         }
 172  
         
 173  
 }