New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix #4439 - Correctly Reverse Translate gbXML Schedules #4440
Conversation
we should have proper checking and error handling
<Schedule type="Fraction" id="Simple_Schedule"> | ||
<YearSchedule id="Simple_Schedule_YearSchedule"> | ||
<BeginDate>2017-01-01</BeginDate> | ||
<EndDate>2017-12-31</EndDate> | ||
<WeekScheduleId weekScheduleIdRef="Simple_Schedule_WeekSchedule" /> | ||
</YearSchedule> | ||
<Name>Simple Year Schedule</Name> | ||
</Schedule> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A simple schedule
<WeekScheduleId weekScheduleIdRef="Complex_Schedule_WeekSchedule_BeginYear" /> | ||
</YearSchedule> | ||
<YearSchedule id="Complex_Schedule_YearSchedule_EndYear"> | ||
<BeginDate>2017-07-01</BeginDate> | ||
<EndDate>2017-12-31</EndDate> | ||
<WeekScheduleId weekScheduleIdRef="Complex_Schedule_WeekSchedule_EndYear" /> | ||
</YearSchedule> | ||
<Name>Complex Year Schedule</Name> | ||
</Schedule> | ||
<WeekSchedule type="Fraction" id="Complex_Schedule_WeekSchedule_BeginYear"> | ||
<Day dayScheduleIdRef="Complex_Schedule_DaySchedule_BeginYear" dayType="All" /> | ||
<Name>Complex Year Schedule - Typical Week January to June</Name> | ||
</WeekSchedule> | ||
<DaySchedule type="Fraction" id="Complex_Schedule_DaySchedule_BeginYear"> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0.1</ScheduleValue> | ||
<ScheduleValue>0.3</ScheduleValue> | ||
<ScheduleValue>0.9</ScheduleValue> | ||
<ScheduleValue>0.9</ScheduleValue> | ||
<ScheduleValue>0.9</ScheduleValue> | ||
<ScheduleValue>0.9</ScheduleValue> | ||
<ScheduleValue>0.8</ScheduleValue> | ||
<ScheduleValue>0.9</ScheduleValue> | ||
<ScheduleValue>0.9</ScheduleValue> | ||
<ScheduleValue>0.9</ScheduleValue> | ||
<ScheduleValue>0.9</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0.3</ScheduleValue> | ||
<ScheduleValue>0.3</ScheduleValue> | ||
<ScheduleValue>0.2</ScheduleValue> | ||
<ScheduleValue>0.2</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<Name>Complex Year Schedule - Typical Day January to June</Name> | ||
</DaySchedule> | ||
|
||
<WeekSchedule type="Fraction" id="Complex_Schedule_WeekSchedule_EndYear"> | ||
<Day dayScheduleIdRef="Complex_Schedule_DaySchedule_EndYear_Weekday" dayType="Weekday" /> | ||
<Day dayScheduleIdRef="Complex_Schedule_DaySchedule_EndYear_Weekend" dayType="Weekend" /> | ||
<Name>Complex Year Schedule - Typical Week July to December</Name> | ||
</WeekSchedule> | ||
<DaySchedule type="Fraction" id="Complex_Schedule_DaySchedule_EndYear_Weekday"> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0.5</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<Name>Complex Year Schedule - Typical Weekday July to December</Name> | ||
</DaySchedule> | ||
<DaySchedule type="Fraction" id="Complex_Schedule_DaySchedule_EndYear_Weekend"> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>1.0</ScheduleValue> | ||
<ScheduleValue>1.0</ScheduleValue> | ||
<ScheduleValue>1.0</ScheduleValue> | ||
<ScheduleValue>1.0</ScheduleValue> | ||
<ScheduleValue>1.0</ScheduleValue> | ||
<ScheduleValue>1.0</ScheduleValue> | ||
<ScheduleValue>1.0</ScheduleValue> | ||
<ScheduleValue>1.0</ScheduleValue> | ||
<ScheduleValue>1.0</ScheduleValue> | ||
<ScheduleValue>1.0</ScheduleValue> | ||
<ScheduleValue>1.0</ScheduleValue> | ||
<ScheduleValue>1.0</ScheduleValue> | ||
<ScheduleValue>1.0</ScheduleValue> | ||
<ScheduleValue>1.0</ScheduleValue> | ||
<ScheduleValue>1.0</ScheduleValue> | ||
<ScheduleValue>1.0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<ScheduleValue>0</ScheduleValue> | ||
<Name>Complex Year Schedule - Typical Weekend July to December</Name> | ||
</DaySchedule> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A more complex schedule: two separate periods
- Jan to June, same day for all
- July to December, one day schedule for weekday and one for weekends
EXPECT_EQ(schDay, schWeek.tuesdaySchedule().get()); | ||
ASSERT_TRUE(schWeek.wednesdaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.wednesdaySchedule().get()); | ||
ASSERT_TRUE(schWeek.thursdaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.thursdaySchedule().get()); | ||
ASSERT_TRUE(schWeek.fridaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.fridaySchedule().get()); | ||
ASSERT_TRUE(schWeek.saturdaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.saturdaySchedule().get()); | ||
ASSERT_TRUE(schWeek.holidaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.holidaySchedule().get()); | ||
ASSERT_TRUE(schWeek.summerDesignDaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.summerDesignDaySchedule().get()); | ||
ASSERT_TRUE(schWeek.winterDesignDaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.winterDesignDaySchedule().get()); | ||
ASSERT_TRUE(schWeek.customDay1Schedule()); | ||
EXPECT_EQ(schDay, schWeek.customDay1Schedule().get()); | ||
ASSERT_TRUE(schWeek.customDay2Schedule()); | ||
EXPECT_EQ(schDay, schWeek.customDay2Schedule().get()); | ||
} | ||
|
||
// Test Complex Schedule | ||
{ | ||
auto schYear_ = m.getConcreteModelObjectByName<ScheduleYear>("Complex Year Schedule"); | ||
EXPECT_TRUE(schYear_); | ||
ASSERT_EQ(2U, schYear_->dates().size()); | ||
EXPECT_EQ(june30, schYear_->dates()[0]); | ||
EXPECT_EQ(dec31, schYear_->dates()[1]); | ||
ASSERT_EQ(2U, schYear_->scheduleWeeks().size()); | ||
|
||
{ | ||
auto schWeek = schYear_->scheduleWeeks()[0]; | ||
EXPECT_EQ("Complex Year Schedule - Typical Week January to June", schWeek.nameString()); | ||
|
||
auto schDay_ = m.getConcreteModelObjectByName<ScheduleDay>("Complex Year Schedule - Typical Day January to June"); | ||
ASSERT_TRUE(schDay_); | ||
auto schDay = schDay_.get(); | ||
|
||
ASSERT_TRUE(schWeek.sundaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.sundaySchedule().get()); | ||
ASSERT_TRUE(schWeek.mondaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.mondaySchedule().get()); | ||
ASSERT_TRUE(schWeek.tuesdaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.tuesdaySchedule().get()); | ||
ASSERT_TRUE(schWeek.wednesdaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.wednesdaySchedule().get()); | ||
ASSERT_TRUE(schWeek.thursdaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.thursdaySchedule().get()); | ||
ASSERT_TRUE(schWeek.fridaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.fridaySchedule().get()); | ||
ASSERT_TRUE(schWeek.saturdaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.saturdaySchedule().get()); | ||
ASSERT_TRUE(schWeek.holidaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.holidaySchedule().get()); | ||
ASSERT_TRUE(schWeek.summerDesignDaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.summerDesignDaySchedule().get()); | ||
ASSERT_TRUE(schWeek.winterDesignDaySchedule()); | ||
EXPECT_EQ(schDay, schWeek.winterDesignDaySchedule().get()); | ||
ASSERT_TRUE(schWeek.customDay1Schedule()); | ||
EXPECT_EQ(schDay, schWeek.customDay1Schedule().get()); | ||
ASSERT_TRUE(schWeek.customDay2Schedule()); | ||
EXPECT_EQ(schDay, schWeek.customDay2Schedule().get()); | ||
} | ||
|
||
{ | ||
auto schWeek = schYear_->scheduleWeeks()[1]; | ||
EXPECT_EQ("Complex Year Schedule - Typical Week July to December", schWeek.nameString()); | ||
|
||
auto schDayWeekday_ = m.getConcreteModelObjectByName<ScheduleDay>("Complex Year Schedule - Typical Weekday July to December"); | ||
ASSERT_TRUE(schDayWeekday_); | ||
auto schDayWeekday = schDayWeekday_.get(); | ||
|
||
auto schDayWeekend_ = m.getConcreteModelObjectByName<ScheduleDay>("Complex Year Schedule - Typical Weekend July to December"); | ||
ASSERT_TRUE(schDayWeekend_); | ||
auto schDayWeekend = schDayWeekend_.get(); | ||
|
||
ASSERT_TRUE(schWeek.mondaySchedule()); | ||
EXPECT_EQ(schDayWeekday, schWeek.mondaySchedule().get()); | ||
ASSERT_TRUE(schWeek.tuesdaySchedule()); | ||
EXPECT_EQ(schDayWeekday, schWeek.tuesdaySchedule().get()); | ||
ASSERT_TRUE(schWeek.wednesdaySchedule()); | ||
EXPECT_EQ(schDayWeekday, schWeek.wednesdaySchedule().get()); | ||
ASSERT_TRUE(schWeek.thursdaySchedule()); | ||
EXPECT_EQ(schDayWeekday, schWeek.thursdaySchedule().get()); | ||
ASSERT_TRUE(schWeek.fridaySchedule()); | ||
EXPECT_EQ(schDayWeekday, schWeek.fridaySchedule().get()); | ||
|
||
ASSERT_TRUE(schWeek.saturdaySchedule()); | ||
EXPECT_EQ(schDayWeekend, schWeek.saturdaySchedule().get()); | ||
ASSERT_TRUE(schWeek.sundaySchedule()); | ||
EXPECT_EQ(schDayWeekend, schWeek.sundaySchedule().get()); | ||
|
||
EXPECT_FALSE(schWeek.holidaySchedule()); | ||
EXPECT_FALSE(schWeek.summerDesignDaySchedule()); | ||
EXPECT_FALSE(schWeek.winterDesignDaySchedule()); | ||
EXPECT_FALSE(schWeek.customDay1Schedule()); | ||
EXPECT_FALSE(schWeek.customDay2Schedule()); | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Test that everything works as expected.
@@ -218,7 +218,7 @@ namespace gbxml { | |||
OS_ASSERT(yd.calendarYear().get() == std::stoi(endDateParts.at(0))); | |||
openstudio::Date endDate = yd.makeDate(std::stoi(endDateParts.at(1)), std::stoi(endDateParts.at(2))); | |||
|
|||
std::string weekScheduleId = element.child("WeekScheduleId").attribute("weekScheduleIdRef").value(); | |||
std::string weekScheduleId = scheduleYearElement.child("WeekScheduleId").attribute("weekScheduleIdRef").value(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actual fix...
Really we need error handling in gbxml... There is currently no validation against the gbXML schema happening and there is very little checking that is done manually (like ensuring that required values/attributes are supplied, or checking that a YearSchedule references a weekScheduleIdRef
you make sure it can be found)
I'll open a separate enhancement request for that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
indeed, it's worth discussing adding in some logic or external lib that can validate gbXML. Thanks for opening up an enhancement request.
CI Results for d08d7a9:
|
@tijcolem I think we have an issue with the way cbci_jenkins_lib is supposed to find and replace the post for CI results :) |
Ok so demonstrated that tests fail before fix: https://ci.commercialbuildings.dev/blue/organizations/jenkins/openstudio-incremental-osx/detail/PR-4440/1/pipeline#step-63-log-7 And work with fix. |
@jmarrec made a few changes to the comment block find/replace. Seems to be working on another PR right now so hopefully next go around for you it'll post correctly. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
looks good and CI is happy!
Pull request overview
Fix #4439 - Correctly Reverse Translate gbXML Schedules.
This is largely a PR that adds tests for gbxml Schedules in the RT. The fix is a single line change.
Pull Request Author
src/gbxml/Test
)Labels:
IDDChange
APIChange
Pull Request - Ready for CI
so that CI builds your PRReview Checklist
This will not be exhaustively relevant to every PR.