@@ -103,6 +103,100 @@ TEST(SettingsVariableTest, String)
103103 EXPECT_EQ (stringVariable.GetValue (), " Value 2" );
104104}
105105
106+ TEST (SettingsVariableTest, ChangedEventSetValue)
107+ {
108+ SettingsVariable<int64_t > intVariable {" int64_t" };
109+ intVariable.SetDefault (10 );
110+ intVariable.SetValue (20 );
111+
112+ std::optional<ChangedEvent<int64_t >> lastChangedEvent;
113+ std::optional<ChangedEvent<int64_t >> lastStagedEvent;
114+
115+ intVariable.changed_signal ().connect (
116+ [&](const ChangedEvent<int64_t >& event) { lastChangedEvent = event; });
117+ intVariable.staged_signal ().connect (
118+ [&](const ChangedEvent<int64_t >& event) { lastStagedEvent = event; });
119+
120+ ASSERT_TRUE (intVariable.SetValue (30 ));
121+
122+ ASSERT_TRUE (lastChangedEvent.has_value ());
123+ EXPECT_EQ (lastChangedEvent->oldValue_ , 20 );
124+ EXPECT_EQ (lastChangedEvent->newValue_ , 30 );
125+
126+ ASSERT_TRUE (lastStagedEvent.has_value ());
127+ EXPECT_EQ (lastStagedEvent->oldValue_ , 20 );
128+ EXPECT_EQ (lastStagedEvent->newValue_ , 30 );
129+
130+ // Verify no signal is emitted on invalid SetValue
131+ lastChangedEvent.reset ();
132+ lastStagedEvent.reset ();
133+ intVariable.SetMinimum (5 );
134+ ASSERT_FALSE (intVariable.SetValue (1 ));
135+ EXPECT_FALSE (lastChangedEvent.has_value ());
136+ EXPECT_FALSE (lastStagedEvent.has_value ());
137+ }
138+
139+ TEST (SettingsVariableTest, ChangedEventSetValueToDefault)
140+ {
141+ SettingsVariable<int64_t > intVariable {" int64_t" };
142+ intVariable.SetDefault (10 );
143+ intVariable.SetValue (20 );
144+
145+ std::optional<ChangedEvent<int64_t >> lastChangedEvent;
146+ std::optional<ChangedEvent<int64_t >> lastStagedEvent;
147+
148+ intVariable.changed_signal ().connect (
149+ [&](const ChangedEvent<int64_t >& event) { lastChangedEvent = event; });
150+ intVariable.staged_signal ().connect (
151+ [&](const ChangedEvent<int64_t >& event) { lastStagedEvent = event; });
152+
153+ intVariable.SetValueToDefault ();
154+
155+ ASSERT_TRUE (lastChangedEvent.has_value ());
156+ EXPECT_EQ (lastChangedEvent->oldValue_ , 20 );
157+ EXPECT_EQ (lastChangedEvent->newValue_ , 10 );
158+
159+ ASSERT_TRUE (lastStagedEvent.has_value ());
160+ EXPECT_EQ (lastStagedEvent->oldValue_ , 20 );
161+ EXPECT_EQ (lastStagedEvent->newValue_ , 10 );
162+ }
163+
164+ TEST (SettingsVariableTest, ChangedEventStageAndCommit)
165+ {
166+ SettingsVariable<int64_t > intVariable {" int64_t" };
167+ intVariable.SetDefault (10 );
168+ intVariable.SetValue (20 );
169+
170+ std::optional<ChangedEvent<int64_t >> lastChangedEvent;
171+ std::optional<ChangedEvent<int64_t >> lastStagedEvent;
172+
173+ intVariable.changed_signal ().connect (
174+ [&](const ChangedEvent<int64_t >& event) { lastChangedEvent = event; });
175+ intVariable.staged_signal ().connect (
176+ [&](const ChangedEvent<int64_t >& event) { lastStagedEvent = event; });
177+
178+ // StageValue should only fire staged_signal, not changed_signal
179+ ASSERT_TRUE (intVariable.StageValue (30 ));
180+ EXPECT_FALSE (lastChangedEvent.has_value ());
181+ ASSERT_TRUE (lastStagedEvent.has_value ());
182+ EXPECT_EQ (lastStagedEvent->oldValue_ , 20 );
183+ EXPECT_EQ (lastStagedEvent->newValue_ , 30 );
184+
185+ // Commit should fire both signals
186+ lastStagedEvent.reset ();
187+ ASSERT_TRUE (intVariable.Commit ());
188+
189+ ASSERT_TRUE (lastChangedEvent.has_value ());
190+ EXPECT_EQ (lastChangedEvent->oldValue_ , 20 );
191+ EXPECT_EQ (lastChangedEvent->newValue_ , 30 );
192+
193+ // The staged signal reports the old staged value (30) and the new current
194+ // value (30) after commit, reflecting that no further staged change remains.
195+ ASSERT_TRUE (lastStagedEvent.has_value ());
196+ EXPECT_EQ (lastStagedEvent->oldValue_ , 30 );
197+ EXPECT_EQ (lastStagedEvent->newValue_ , 30 );
198+ }
199+
106200} // namespace settings
107201} // namespace qt
108202} // namespace scwx
0 commit comments