def test_schedule_ruleset_average_schedules_date_range():
    """Test the ScheduleRuleset average_schedules method with schedules over a date range."""
    weekday_school = ScheduleDay(
        'Weekday School Year', [0.1, 1, 0.1],
        [Time(0, 0), Time(8, 0), Time(17, 0)])
    weekend_school = ScheduleDay('Weekend School Year', [0.1])
    weekday_summer = ScheduleDay(
        'Weekday Summer', [0, 0.5, 0],
        [Time(0, 0), Time(9, 0), Time(17, 0)])
    weekend_summer = ScheduleDay('Weekend Summer', [0])

    summer_weekday_rule = ScheduleRule(weekday_summer,
                                       start_date=Date(7, 1),
                                       end_date=Date(9, 1))
    summer_weekday_rule.apply_weekday = True
    summer_weekend_rule = ScheduleRule(weekend_summer,
                                       start_date=Date(7, 1),
                                       end_date=Date(9, 1))
    summer_weekend_rule.apply_weekend = True
    summer_weekend_rule.apply_holiday = True
    school_weekend_rule = ScheduleRule(weekend_school)
    school_weekend_rule.apply_weekend = True
    school_weekend_rule.apply_holiday = True

    summer_design = ScheduleDay(
        'School Summer Design', [0, 1, 0.25],
        [Time(0, 0), Time(6, 0), Time(18, 0)])
    winter_design = ScheduleDay('School Winter Design', [0])

    all_rules = [summer_weekday_rule, summer_weekend_rule, school_weekend_rule]
    school_schedule = ScheduleRuleset('School Occupancy', weekday_school,
                                      all_rules, schedule_types.fractional,
                                      summer_design, winter_design)
    lobby_schedule = ScheduleRuleset.from_constant_value(
        'Lobby Occupancy', 0.1, schedule_types.fractional)

    school_avg = ScheduleRuleset.average_schedules(
        'Office Average', [school_schedule, lobby_schedule])

    week_vals = school_avg.values(end_date=Date(1, 7))
    avg_vals = [
        0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.55, 0.55, 0.55, 0.55, 0.55,
        0.55, 0.55, 0.55, 0.55, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1
    ]
    assert week_vals[:24] == [0.1] * 24
    assert week_vals[24:48] == avg_vals

    week_vals = school_avg.values(start_date=Date(7, 1), end_date=Date(7, 7))
    avg_vals = [
        0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.3, 0.3, 0.3,
        0.3, 0.3, 0.3, 0.3, 0.3, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05
    ]
    assert week_vals[:24] == [0.05] * 24
    assert week_vals[24:48] == avg_vals
def test_schedule_rule_apply():
    """Test the ScheduleRule apply properties."""
    simple_office = ScheduleDay(
        'Simple Office Occupancy', [0, 1, 0],
        [Time(0, 0), Time(9, 0), Time(17, 0)])
    sched_rule = ScheduleRule(simple_office)

    assert not sched_rule.apply_sunday
    sched_rule.apply_sunday = True
    assert sched_rule.apply_sunday
    assert not sched_rule.apply_monday
    sched_rule.apply_monday = True
    assert sched_rule.apply_monday
    assert not sched_rule.apply_tuesday
    sched_rule.apply_tuesday = True
    assert sched_rule.apply_tuesday
    assert not sched_rule.apply_wednesday
    sched_rule.apply_wednesday = True
    assert sched_rule.apply_wednesday
    assert not sched_rule.apply_thursday
    sched_rule.apply_thursday = True
    assert sched_rule.apply_thursday
    assert not sched_rule.apply_friday
    sched_rule.apply_friday = True
    assert sched_rule.apply_friday
    assert not sched_rule.apply_saturday
    sched_rule.apply_saturday = True
    assert sched_rule.apply_saturday
    assert not sched_rule.apply_holiday
    sched_rule.apply_holiday = True
    assert sched_rule.apply_holiday

    assert sched_rule.apply_weekday
    assert sched_rule.apply_weekend
    assert sched_rule.apply_all
def test_schedule_does_rule_apply():
    """Test the ScheduleRule does_rule_apply properties."""
    weekday_school = ScheduleDay(
        'Weekday School Year', [0, 1, 0.5, 0],
        [Time(0, 0), Time(8, 0),
         Time(15, 0), Time(18, 0)])
    weekend_school = ScheduleDay('Weekend School Year', [0])
    weekday_summer = ScheduleDay(
        'Weekday Summer', [0, 0.5, 0],
        [Time(0, 0), Time(9, 0), Time(17, 0)])
    weekend_summer = ScheduleDay('Weekend Summer', [0])

    school_weekday_rule = ScheduleRule(weekday_school)
    school_weekday_rule.apply_weekday = True
    school_weekend_rule = ScheduleRule(weekend_school)
    school_weekend_rule.apply_weekend = True
    school_weekend_rule.apply_holiday = True

    summer_weekday_rule = ScheduleRule(weekday_summer,
                                       start_date=Date(7, 1),
                                       end_date=Date(9, 1))
    summer_weekday_rule.apply_weekday = True
    summer_weekend_rule = ScheduleRule(weekend_summer,
                                       start_date=Date(7, 1),
                                       end_date=Date(9, 1))
    summer_weekend_rule.apply_weekend = True
    summer_weekend_rule.apply_holiday = True

    assert school_weekday_rule.does_rule_apply(1, 4)
    assert not school_weekday_rule.does_rule_apply(1, 1)

    assert school_weekend_rule.does_rule_apply(1, 1)
    assert not school_weekend_rule.does_rule_apply(1, 4)

    assert summer_weekday_rule.does_rule_apply(Date(7, 15).doy, 4)
    assert not summer_weekday_rule.does_rule_apply(Date(7, 15).doy, 1)
    assert not summer_weekday_rule.does_rule_apply(1, 4)

    assert school_weekend_rule.does_rule_apply(Date(7, 15).doy, 1)
    assert not school_weekend_rule.does_rule_apply(Date(7, 15).doy, 4)
    assert not summer_weekday_rule.does_rule_apply(1, 1)
def test_schedule_ruleset_to_idf_date_range():
    """Test the ScheduleRuleset to_idf and from_idf methods."""
    weekday_school = ScheduleDay(
        'Weekday School Year', [0, 1, 0.5, 0],
        [Time(0, 0), Time(8, 0),
         Time(15, 0), Time(18, 0)])
    weekend_school = ScheduleDay('Weekend School Year', [0])
    weekday_summer = ScheduleDay(
        'Weekday Summer', [0, 0.5, 0],
        [Time(0, 0), Time(9, 0), Time(17, 0)])
    weekend_summer = ScheduleDay('Weekend Summer', [0])

    summer_weekday_rule = ScheduleRule(weekday_summer,
                                       start_date=Date(7, 1),
                                       end_date=Date(9, 1))
    summer_weekday_rule.apply_weekday = True
    summer_weekend_rule = ScheduleRule(weekend_summer,
                                       start_date=Date(7, 1),
                                       end_date=Date(9, 1))
    summer_weekend_rule.apply_weekend = True
    summer_weekend_rule.apply_holiday = True
    school_weekend_rule = ScheduleRule(weekend_school)
    school_weekend_rule.apply_weekend = True
    school_weekend_rule.apply_holiday = True

    summer_design = ScheduleDay(
        'School Summer Design', [0, 1, 0.25],
        [Time(0, 0), Time(6, 0), Time(18, 0)])
    winter_design = ScheduleDay('School Winter Design', [0])

    schedule = ScheduleRuleset(
        'School Occupancy', weekday_school,
        [summer_weekday_rule, summer_weekend_rule, school_weekend_rule],
        schedule_types.fractional, summer_design, winter_design)

    year_sched, week_scheds = schedule.to_idf()

    assert len(year_sched.split(',')) > 6
    assert len(week_scheds) == 2
    """