Ver código fonte

Fix #520 -- bug where 0-step status transition had max_int length

Chris Mullins 6 anos atrás
pai
commit
e92c643e2f

+ 9 - 1
lib/Transitions/FieldTransition.cpp

@@ -3,7 +3,15 @@
 #include <algorithm>
 
 FieldTransition::Builder::Builder(size_t id, const BulbId& bulbId, TransitionFn callback, GroupStateField field, uint16_t start, uint16_t end)
-  : Transition::Builder(id, bulbId, callback, std::ceil(static_cast<int16_t>(end) - start))
+  : Transition::Builder(
+      id,
+      bulbId,
+      callback,
+      max(
+        static_cast<size_t>(1),
+        static_cast<size_t>(std::ceil(static_cast<int16_t>(end) - start))
+      )
+  )
   , stepSize(0)
   , field(field)
   , start(start)

+ 1 - 0
lib/Transitions/Transition.cpp

@@ -37,6 +37,7 @@ Transition::Builder& Transition::Builder::setDurationAwarePeriod(size_t period,
   } else {
     setPeriod(period);
   }
+  return *this;
 }
 
 size_t Transition::Builder::getNumPeriods() const {

+ 14 - 0
test/remote/spec/transition_spec.rb

@@ -281,6 +281,20 @@ RSpec.describe 'Transitions' do
   end
 
   context 'status transition' do
+    it 'should turn off even if starting brightness is 0' do
+      @client.patch_state({status: 'ON', brightness: 0}, @id_params)
+      seen_off = false
+
+      @mqtt_client.on_update(@id_params) do |id, message|
+        seen_off = (message['state'] == 'OFF')
+      end
+
+      @client.patch_state({status: "OFF", transition: 1}, @id_params)
+      @mqtt_client.wait_for_listeners
+
+      expect(seen_off).to eq(true)
+    end
+
     it 'should transition from off -> on' do
       seen_updates = {}
       @client.patch_state({status: 'OFF'}, @id_params)