package com.github.atemerev.hollywood.office;
import com.github.atemerev.hollywood.Hollywood;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.util.concurrent.CountDownLatch;
/**
* @author Alexander Temerev
* @version $Id$
*/
public class OfficeTest {
private Secretary secretary;
public @Before void init() {
//1.创建Actor: Actor是对某种事件做出响应的实体. 比如人会对特定事件做出特定反应.
//这里举例邮政公司的秘书为例. 秘书要处理各种各样的事件.
//在处理事件前中后,都会有特定的状态,而导致其他事件无法进行.
//事件状态发生变化都要能够及时通知为外部事件.
this.secretary = Hollywood.createActor(Secretary.class);
//初始化计数器=2
PostOffice.instance().setLatch(new CountDownLatch(2));
}
public @Test void testLifecycle() throws Exception {
secretary.goToWork();
Assert.assertTrue(secretary.state() instanceof Secretary.Working);
//接收2个新建
Letter letter = new Letter("Dear Mary...");
secretary.acceptLetter(letter);
letter = new Letter("Mr. Davies, I am very disappointed...");
secretary.acceptLetter(letter);
//第一个电话打进来, 状态由上班中-->正在通话中. 上班中才可以接听新电话. 正在通话中不可以接听新的电话
//因为Actor是消息传递机制,所以后面2个电话打进来时,都会占线
Call call = new Call("Hello! I'm your new client...");
secretary.processMessage(call);
//第一个电话接听完毕,状态变为上班中,可以接收新的电话
Assert.assertTrue(secretary.state() instanceof Secretary.Working);
//第二个电话中包含fax关键词,接完电话后,还要去发送传真,才可以开始接听第三个电话
call = new Call("Can you send me your price list by fax?");
secretary.processMessage(call);
call = new Call("The work day is over. You can go home now.");
secretary.processMessage(call);
//等待计数器归零. 什么时候计数器会减少: 发送信件的时候! <--Working状态要退出前
PostOffice.instance().getLatch().await();
//通过计数器确保最后的2行代码最后才执行! 验证一天的工作量是否符合.
Assert.assertEquals(2, PostOffice.instance().getSendLettersCount());
Assert.assertEquals(3, Phone.instance().getCallCount());
}
}