Skip to content

Commit ea00982

Browse files
Add measurement assertions for various tests
- Enhanced integration tests for subcircuits, voltage-controlled sources, and VSwitch components by adding measurement assertions for current and voltage. - Updated DC, transient, and parameter tests to include measurement assertions for maximum values. - Improved waveform tests for AM and SFFM by incorporating measurement assertions for maximum voltage. - Ensured consistency across all test cases by implementing the same measurement assertion pattern.
1 parent 9047d44 commit ea00982

21 files changed

Lines changed: 309 additions & 1 deletion

src/SpiceSharpParser.IntegrationTests/BaseTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,5 +362,21 @@ protected bool EqualsWithTol(IEnumerable<double> exports, IEnumerable<double> re
362362

363363
return true;
364364
}
365+
366+
protected void AssertMeasurement(SpiceSharpModel model, string name, double expectedValue)
367+
{
368+
Assert.True(model.Measurements.ContainsKey(name), $"Measurement '{name}' not found");
369+
var results = model.Measurements[name];
370+
Assert.True(results.Count > 0, $"Measurement '{name}' has no results");
371+
Assert.True(results[0].Success, $"Measurement '{name}' failed");
372+
Assert.True(EqualsWithTol(expectedValue, results[0].Value),
373+
$"Measurement '{name}': expected {expectedValue}, got {results[0].Value}");
374+
}
375+
376+
protected void AssertMeasurementSuccess(SpiceSharpModel model, string name)
377+
{
378+
Assert.True(model.Measurements.ContainsKey(name), $"Measurement '{name}' not found");
379+
Assert.True(model.Measurements[name][0].Success, $"Measurement '{name}' failed");
380+
}
365381
}
366382
}

src/SpiceSharpParser.IntegrationTests/Components/ArbitraryBehavioralTests.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ public void Test01()
1313
"R1 1 0 10",
1414
".SAVE V(1,0)",
1515
".OP",
16+
".MEAS OP meas_v MAX V(1,0)",
1617
".END");
1718

1819
Assert.NotNull(model);
1920
var export = RunOpSimulation(model, "V(1,0)");
2021
Assert.Equal(100, export);
22+
AssertMeasurement(model, "meas_v", export);
2123
}
2224

2325
[Fact]
@@ -29,11 +31,13 @@ public void Test02()
2931
"R1 1 0 10",
3032
".SAVE V(1,0)",
3133
".OP",
34+
".MEAS OP meas_v MAX V(1,0)",
3235
".END");
3336

3437
Assert.NotNull(model);
3538
var export = RunOpSimulation(model, "V(1,0)");
3639
Assert.Equal(-1000, export);
40+
AssertMeasurement(model, "meas_v", export);
3741
}
3842
}
3943
}

src/SpiceSharpParser.IntegrationTests/Components/CapacitorTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public void When_RCCircuitInOPSimulation_Expect_ShouldActLikeAnOpenCircuit()
1515
"C1 OUT 0 10e-6",
1616
".OP",
1717
".SAVE V(OUT)",
18+
".MEAS OP meas_v MAX V(OUT)",
1819
".END");
1920

2021
double export = RunOpSimulation(netlist, "V(OUT)");
@@ -23,6 +24,7 @@ public void When_RCCircuitInOPSimulation_Expect_ShouldActLikeAnOpenCircuit()
2324
double[] references = { 1.0 };
2425

2526
Assert.True(EqualsWithTol(new double[] { export }, references));
27+
AssertMeasurement(netlist, "meas_v", export);
2628
}
2729

2830
[Fact]
@@ -35,6 +37,7 @@ public void When_RCCircuitInOPSimulationWithMultiply_Expect_ShouldActLikeAnOpenC
3537
"C1 OUT 0 10e-6 m = 2",
3638
".OP",
3739
".SAVE V(OUT)",
40+
".MEAS OP meas_v MAX V(OUT)",
3841
".END");
3942

4043
double export = RunOpSimulation(netlist, "V(OUT)");
@@ -43,6 +46,7 @@ public void When_RCCircuitInOPSimulationWithMultiply_Expect_ShouldActLikeAnOpenC
4346
double[] references = { 1.0 };
4447

4548
Assert.True(EqualsWithTol(new double[] { export }, references));
49+
AssertMeasurement(netlist, "meas_v", export);
4650
}
4751

4852
[Fact]
@@ -61,11 +65,13 @@ public void When_RCCircuitInTranSimulation_Expect_Reference()
6165
".IC V(OUT)=0.0",
6266
".TRAN 1e-8 10e-6",
6367
".SAVE V(OUT)",
68+
".MEAS TRAN meas_vmax MAX V(OUT)",
6469
".END");
6570

6671
var exports = RunTransientSimulation(netlist, "V(OUT)");
6772
Func<double, double> reference = t => dcVoltage * (1.0 - Math.Exp(-t / tau));
6873
Assert.True(EqualsWithTol(exports, reference));
74+
AssertMeasurement(netlist, "meas_vmax", reference(10e-6));
6975
}
7076

7177

@@ -85,11 +91,13 @@ public void When_RCCircuitInTranSimulationWithMultiply_Expect_Reference()
8591
".IC V(OUT)=0.0",
8692
".TRAN 1e-8 10e-6",
8793
".SAVE V(OUT)",
94+
".MEAS TRAN meas_vmax MAX V(OUT)",
8895
".END");
8996

9097
var exports = RunTransientSimulation(netlist, "V(OUT)");
9198
Func<double, double> reference = t => dcVoltage * (1.0 - Math.Exp(-t / tau));
9299
Assert.True(EqualsWithTol(exports, reference));
100+
AssertMeasurement(netlist, "meas_vmax", reference(10e-6));
93101
}
94102

95103
[Fact]
@@ -109,11 +117,13 @@ public void When_RCCircuitInTranSimulationBehavioral_Expect_Reference()
109117
".IC V(OUT)=0.0",
110118
".TRAN 1e-12 10e-6",
111119
".SAVE V(OUT)",
120+
".MEAS TRAN meas_vmax MAX V(OUT)",
112121
".END");
113122

114123
var exports = RunTransientSimulation(netlist, "V(OUT)");
115124
Func<double, double> reference = t => dcVoltage * (1.0 - Math.Exp(-t / tau));
116125
Assert.True(EqualsWithTol(exports, reference));
126+
AssertMeasurement(netlist, "meas_vmax", reference(10e-6));
117127
}
118128

119129
[Fact]
@@ -133,11 +143,13 @@ public void When_RCCircuitInTranSimulationBehavioralWithMandN_Expect_Reference()
133143
".IC V(OUT)=0.0",
134144
".TRAN 1e-12 10e-6",
135145
".SAVE V(OUT)",
146+
".MEAS TRAN meas_vmax MAX V(OUT)",
136147
".END");
137148

138149
var exports = RunTransientSimulation(netlist, "V(OUT)");
139150
Func<double, double> reference = t => dcVoltage * (1.0 - Math.Exp(-t / tau));
140151
Assert.True(EqualsWithTol(exports, reference));
152+
AssertMeasurement(netlist, "meas_vmax", reference(10e-6));
141153
}
142154

143155
[Fact]
@@ -157,11 +169,13 @@ public void When_TemperatureInvariantCapacitor_Expect_Reference()
157169
".TRAN 1e-8 10e-6",
158170
".SAVE V(OUT)",
159171
".OPTIONS TEMP = 10",
172+
".MEAS TRAN meas_vmax MAX V(OUT)",
160173
".END");
161174

162175
var exports = RunTransientSimulation(netlist, "V(OUT)");
163176
Func<double, double> reference = t => dcVoltage * (1.0 - Math.Exp(-t / tau));
164177
Assert.True(EqualsWithTol(exports, reference));
178+
AssertMeasurement(netlist, "meas_vmax", reference(10e-6));
165179
}
166180

167181
[Fact]
@@ -181,11 +195,13 @@ public void When_TemperatureInvariantCapacitorWithMultiply_Expect_Reference()
181195
".TRAN 1e-8 10e-6",
182196
".SAVE V(OUT)",
183197
".OPTIONS TEMP = 10",
198+
".MEAS TRAN meas_vmax MAX V(OUT)",
184199
".END");
185200

186201
var exports = RunTransientSimulation(netlist, "V(OUT)");
187202
Func<double, double> reference = t => dcVoltage * (1.0 - Math.Exp(-t / tau));
188203
Assert.True(EqualsWithTol(exports, reference));
204+
AssertMeasurement(netlist, "meas_vmax", reference(10e-6));
189205
}
190206

191207
[Fact]
@@ -205,11 +221,13 @@ public void When_TemperatureDependentCapacitor_Expect_Reference()
205221
".TRAN 1e-8 10e-6",
206222
".SAVE V(OUT)",
207223
".OPTIONS TEMP = 30",
224+
".MEAS TRAN meas_vmax MAX V(OUT)",
208225
".END");
209226

210227
var exports = RunTransientSimulation(netlist, "V(OUT)");
211228
Func<double, double> reference = t => dcVoltage * (1.0 - Math.Exp(-t / tau));
212229
Assert.True(EqualsWithTol(exports, reference));
230+
AssertMeasurement(netlist, "meas_vmax", reference(10e-6));
213231
}
214232

215233
[Fact]
@@ -229,11 +247,13 @@ public void When_TemperatureDependentCapacitorWithMuliply_Expect_Reference()
229247
".TRAN 1e-8 10e-6",
230248
".SAVE V(OUT)",
231249
".OPTIONS TEMP = 30",
250+
".MEAS TRAN meas_vmax MAX V(OUT)",
232251
".END");
233252

234253
var exports = RunTransientSimulation(netlist, "V(OUT)");
235254
Func<double, double> reference = t => dcVoltage * (1.0 - Math.Exp(-t / tau));
236255
Assert.True(EqualsWithTol(exports, reference));
256+
AssertMeasurement(netlist, "meas_vmax", reference(10e-6));
237257
}
238258

239259
[Fact]
@@ -253,11 +273,13 @@ public void When_TemperatureDependentCapacitorOnlyTC1_Expect_Reference()
253273
".TRAN 1e-8 10e-6",
254274
".SAVE V(OUT)",
255275
".OPTIONS TEMP = 30",
276+
".MEAS TRAN meas_vmax MAX V(OUT)",
256277
".END");
257278

258279
var exports = RunTransientSimulation(netlist, "V(OUT)");
259280
Func<double, double> reference = t => dcVoltage * (1.0 - Math.Exp(-t / tau));
260281
Assert.True(EqualsWithTol(exports, reference));
282+
AssertMeasurement(netlist, "meas_vmax", reference(10e-6));
261283
}
262284

263285
[Fact]
@@ -277,11 +299,13 @@ public void When_TemperatureDependentCapacitorOnlyTC1WithMultiply_Expect_Referen
277299
".TRAN 1e-8 10e-6",
278300
".SAVE V(OUT)",
279301
".OPTIONS TEMP = 30",
302+
".MEAS TRAN meas_vmax MAX V(OUT)",
280303
".END");
281304

282305
var exports = RunTransientSimulation(netlist, "V(OUT)");
283306
Func<double, double> reference = t => dcVoltage * (1.0 - Math.Exp(-t / tau));
284307
Assert.True(EqualsWithTol(exports, reference));
308+
AssertMeasurement(netlist, "meas_vmax", reference(10e-6));
285309
}
286310
}
287311
}

src/SpiceSharpParser.IntegrationTests/Components/CurrentControlledSourcesTests.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@ public void CurrentControlledCurrentSource()
1515
"R2 2 0 2",
1616
".SAVE I(R2)",
1717
".OP",
18+
".MEAS OP meas_i MAX I(R2)",
1819
".END");
1920

2021
var export = RunOpSimulation(netlist, "I(R2)");
2122
Assert.NotNull(netlist);
2223
Assert.Equal(15, export);
24+
AssertMeasurement(netlist, "meas_i", export);
2325
}
2426

2527
[Fact]
@@ -33,11 +35,13 @@ public void CurrentControlledVoltageSource()
3335
"R2 2 0 2",
3436
".SAVE I(R2)",
3537
".OP",
38+
".MEAS OP meas_i MAX I(R2)",
3639
".END");
3740

3841
var export = RunOpSimulation(netlist, "I(R2)");
3942
Assert.NotNull(netlist);
4043
Assert.Equal(-7.5, export);
44+
AssertMeasurement(netlist, "meas_i", export);
4145
}
4246
}
4347
}

src/SpiceSharpParser.IntegrationTests/Components/DiodeTests.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public void EqualsToSpice3f5()
1414
".model 1N914 D(Is=2.52e-9 Rs=0.568 N=1.752 Cjo=4e-12 M=0.4 tt=20e-9)",
1515
".DC V1 -1 1 10e-3",
1616
".SAVE i(V1)",
17+
".MEAS DC meas_imax MAX i(V1)",
1718
".END");
1819

1920
var export = RunDCSimulation(netlist, "i(V1)");
@@ -25,6 +26,7 @@ public void EqualsToSpice3f5()
2526
};
2627

2728
Assert.True(EqualsWithTol(export, references));
29+
AssertMeasurementSuccess(netlist, "meas_imax");
2830
}
2931

3032
[Fact]
@@ -37,6 +39,7 @@ public void WhenMisSpecified()
3739
".model 1N914 D(Is=2.52e-9 Rs=0.568 N=1.752 Cjo=4e-12 M=0.4 tt=20e-9)",
3840
".DC V1 -1 1 10e-3",
3941
".SAVE i(V1)",
42+
".MEAS DC meas_imax MAX i(V1)",
4043
".END");
4144

4245
var export = RunDCSimulation(netlist, "i(V1)");
@@ -48,6 +51,7 @@ public void WhenMisSpecified()
4851
};
4952

5053
Assert.True(EqualsWithTol(export, references));
54+
AssertMeasurementSuccess(netlist, "meas_imax");
5155
}
5256

5357
[Fact]
@@ -60,6 +64,7 @@ public void DefaultModel()
6064
".model default D",
6165
".DC V1 -1 1 0.5",
6266
".SAVE i(V1)",
67+
".MEAS DC meas_imax MAX i(V1)",
6368
".END");
6469

6570
var export = RunDCSimulation(netlist, "i(V1)");
@@ -75,6 +80,7 @@ public void DefaultModel()
7580
};
7681

7782
Assert.True(EqualsWithTol(export, references));
83+
AssertMeasurementSuccess(netlist, "meas_imax");
7884
}
7985
}
8086
}

src/SpiceSharpParser.IntegrationTests/Components/ISwitchTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ public void PartialOnTest()
1616
".model imodel ISWITCH (roff=100 ron=10 ioff = 0 ion = 2)",
1717
".OP",
1818
".SAVE I(V2)",
19+
".MEAS OP meas_i MAX I(V2)",
1920
".END");
2021

2122
var export = RunOpSimulation(netlist, "I(V2)");
2223
Assert.NotNull(netlist);
2324
Assert.True(EqualsWithTol(-0.316228, export));
25+
AssertMeasurement(netlist, "meas_i", export);
2426
}
2527

2628
[Fact]
@@ -38,11 +40,13 @@ public void PartialOnInSubcktTest()
3840
".model imodel ISWITCH (roff=100 ron=10 ioff = 0 ion = 2)",
3941
".OP",
4042
".SAVE I(V2)",
43+
".MEAS OP meas_i MAX I(V2)",
4144
".END");
4245

4346
var export = RunOpSimulation(netlist, "I(V2)");
4447
Assert.NotNull(netlist);
4548
Assert.True(EqualsWithTol(-0.316228, export));
49+
AssertMeasurement(netlist, "meas_i", export);
4650
}
4751

4852
[Fact]
@@ -57,11 +61,13 @@ public void OnTest()
5761
".model imodel ISWITCH (roff=1000000 ron=10 ioff = 0 ion = 2)",
5862
".OP",
5963
".SAVE I(V2)",
64+
".MEAS OP meas_i MAX I(V2)",
6065
".END");
6166

6267
var export = RunOpSimulation(netlist, "I(V2)");
6368
Assert.NotNull(netlist);
6469
Assert.Equal(-1, export);
70+
AssertMeasurement(netlist, "meas_i", export);
6571
}
6672

6773
[Fact]
@@ -76,11 +82,13 @@ public void OnMoreTest()
7682
".model imodel ISWITCH (roff=1000000 ron=10 ioff = 0 ion = 2)",
7783
".OP",
7884
".SAVE I(V2)",
85+
".MEAS OP meas_i MAX I(V2)",
7986
".END");
8087

8188
var export = RunOpSimulation(netlist, "I(V2)");
8289
Assert.NotNull(netlist);
8390
Assert.Equal(-1, export);
91+
AssertMeasurement(netlist, "meas_i", export);
8492
}
8593

8694
[Fact]
@@ -95,11 +103,13 @@ public void OffTest()
95103
".model imodel ISWITCH (roff=1000000 ron=10 ioff = 0 ion = 2)",
96104
".OP",
97105
".SAVE I(V2)",
106+
".MEAS OP meas_i MAX I(V2)",
98107
".END");
99108

100109
var export = RunOpSimulation(netlist, "I(V2)");
101110
Assert.NotNull(netlist);
102111
Assert.True(EqualsWithTol(-10.0 / 1000000.0, export));
112+
AssertMeasurement(netlist, "meas_i", export);
103113
}
104114

105115
[Fact]
@@ -114,11 +124,13 @@ public void OffMoreTest()
114124
".model imodel ISWITCH (roff=1000000 ron=10 ioff = 0 ion = 2)",
115125
".OP",
116126
".SAVE I(V2)",
127+
".MEAS OP meas_i MAX I(V2)",
117128
".END");
118129

119130
var export = RunOpSimulation(netlist, "I(V2)");
120131
Assert.NotNull(netlist);
121132
Assert.True(EqualsWithTol(-10.0 / 1000000.0, export));
133+
AssertMeasurement(netlist, "meas_i", export);
122134
}
123135
}
124136
}

0 commit comments

Comments
 (0)