3.1火灾警报软件的例子
处理单元连接到多个火灾传感器,并连续轮询它们以获取异常读数。发现火灾时,警报声响起。如果火势开始蔓延并且触发了另一个检测器,则会自动呼叫消防队。具体需求如下:
- 如果所有传感器均报告无异常,则表明系统正常,无需采取任何措施。
- 如果触发了一个传感器,则会发出警报声(但由于吸烟者粗心大意,无法抗拒香烟,这可能是误报)。
- 如果触发了多个传感器,则会呼叫消防队(因为火势蔓延到一个以上的房间)。
//实现监视的主类
public class FireEarlyWarning {
private int sensorsDetectingFire = 0;
//方法称为每秒钟由传感器软件
public void feedData(int triggeredFireSensors)
{
sensorsDetectingFire = triggeredFireSensors;
}
//状态报告获取方法
public WarningStatus getCurrentStatus()
{
return new WarningStatus(sensorsDetectingFire > 0, sensorsDetectingFire > 1);
}
}
//状态报告内容(状态类)
public class WarningStatus {
private final boolean alarmActive;
private final boolean fireDepartmentNotified;
public WarningStatus(boolean alarmActive,boolean fireDepartmentNotified)
{
this.alarmActive = alarmActive;
this.fireDepartmentNotified = fireDepartmentNotified;
}
//若为true,警报就会响起。
public boolean isAlarmActive() {
return alarmActive;
}
//若为true,就呼叫消防队。
public boolean isFireDepartmentNotified() {
return fireDepartmentNotified;
}
}
3.5 火警系统的全部Spock测试
class FireSensorSpec extends spock.lang.Specification{
//清楚地解释这个测试的作用
def "如果所有传感器都不活动,那么一切都没问题"() {
given: "所有的火灾传感器都关闭了"
FireEarlyWarning fireEarlyWarning = new FireEarlyWarning()
int triggeredSensors = 0
when: "我们询问消防状况"
fireEarlyWarning.feedData(triggeredSensors)
WarningStatus status = fireEarlyWarning.getCurrentStatus()
then: "不应触发警报/通知"
!status.alarmActive
!status.fireDepartmentNotified
}
def "如果一个传感器是启动的,警报应该发出预防措施"() {
given: "只有一个火情传感器是启动的"
FireEarlyWarning fireEarlyWarning =