This commit is contained in:
deeaitch committed 2026-10-13 08:17:49 -04:00
1 parent 7022c84941
commit c3d3bd51fb
72 files changed
+3703 -2484

No files matched your search

+289 -296
View File
@@ -703,313 +703,306 @@ $(document).ready(function(){initNavTree('dbc__parser__test_8cpp_source.html',''
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno"> 603</span> <span class="stringliteral">&quot;Adjacent large integers remain distinct&quot;</span>);</div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno"> 604</span> std::vector&lt;DecodeFrame&gt; definitions = runtime.<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>();</div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno"> 605</span> definitions[0].signals[1].length = 0U;</div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno"> 606</span> runtime = <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(definitions);</div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"> 607</span> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(runtime, raw);</div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno"> 608</span> CHECK(result.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a> == SignalDecodeStatus::InvalidDefinition &amp;&amp;</div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno"> 609</span> result.signals[1].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a> == SignalDecodeStatus::InvalidDefinition,</div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno"> 610</span> <span class="stringliteral">&quot;Malformed runtime selector distinguished from payload errors&quot;</span>);</div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"> 611</span> definitions[0].signals.pop_back();</div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno"> 612</span> runtime = <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(definitions);</div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno"> 613</span> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(runtime, raw);</div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno"> 614</span> CHECK(result.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a> == SignalDecodeStatus::InvalidDefinition,</div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno"> 615</span> <span class="stringliteral">&quot;Missing runtime selector&quot;</span>);</div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"> 616</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 2 ECU\n\n&quot;</span></div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno"> 617</span> <span class="stringliteral">&quot;SG_ Branch m2 : 8|8@1+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno"> 618</span> <span class="stringliteral">&quot;SG_ Mode M : 0|1@1+ (1,0) [0|1] \&quot;\&quot; ECU\n&quot;</span>);</div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"> 619</span> <span class="keywordtype">bool</span> rejected = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno"> 620</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"> 621</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno"> 622</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno"> 623</span> rejected = std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:3: &quot;</span>) == 0U;</div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno"> 624</span> }</div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno"> 625</span> CHECK(rejected, <span class="stringliteral">&quot;Deferred validation reports branch source line&quot;</span>);</div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno"> 626</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 2 ECU\n&quot;</span></div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno"> 627</span> <span class="stringliteral">&quot;SG_ A : 8|8@1+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno"> 628</span> <span class="stringliteral">&quot;SG_ B : 15|8@0+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span>);</div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"> 629</span> rejected = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno"> 630</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno"> 631</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"> 632</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;) {</div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno"> 633</span> rejected = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno"> 634</span> }</div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno"> 635</span> CHECK(rejected, <span class="stringliteral">&quot;Ordinary overlapping signals rejected&quot;</span>);</div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno"> 636</span>}</div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno"> 637</span> </div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"> 638</span><span class="keywordtype">void</span> DbcParserTest::invalidSignals() {</div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno"> 639</span> Fixture fixture;</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno"> 640</span> <span class="keyword">const</span> std::string ordinary = SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>);</div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno"> 641</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string value: {<span class="stringliteral">&quot;-1&quot;</span>, <span class="stringliteral">&quot;+1&quot;</span>, <span class="stringliteral">&quot;0junk&quot;</span>, <span class="stringliteral">&quot;0x10&quot;</span>, <span class="stringliteral">&quot;1.5&quot;</span>,</div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno"> 642</span> <span class="stringliteral">&quot;4294967296&quot;</span>, <span class="stringliteral">&quot;999999999999999999999&quot;</span>}) {</div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno"> 643</span> RejectSignal(fixture, SignalLine(value, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno"> 644</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, value, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"> 645</span> }</div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno"> 646</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string length: {<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;65&quot;</span>})</div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno"> 647</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, length, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno"> 648</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string order: {<span class="stringliteral">&quot;2+&quot;</span>, <span class="stringliteral">&quot;9-&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1x&quot;</span>, <span class="stringliteral">&quot;1++&quot;</span>, <span class="stringliteral">&quot;01+&quot;</span>})</div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno"> 649</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, order, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno"> 650</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string value: {<span class="stringliteral">&quot;1junk&quot;</span>, <span class="stringliteral">&quot;nan&quot;</span>, <span class="stringliteral">&quot;NaN&quot;</span>, <span class="stringliteral">&quot;inf&quot;</span>, <span class="stringliteral">&quot;-inf&quot;</span>, <span class="stringliteral">&quot;1e999&quot;</span>, <span class="stringliteral">&quot;1e-999&quot;</span>, <span class="stringliteral">&quot;0x1p2&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;1e&quot;</span>, <span class="stringliteral">&quot;1.2.3&quot;</span>}) {</div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"> 651</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, value, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno"> 652</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, value, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno"> 653</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, value, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno"> 654</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, value));</div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno"> 655</span> }</div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno"> 656</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;2&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>));</div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno"> 657</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string name: {<span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;Two Names&quot;</span>, <span class="stringliteral">&quot;Value m1M&quot;</span>}) {</div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno"> 658</span> std::string line = ordinary;</div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno"> 659</span> line.replace(4U, 5U, name);</div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno"> 660</span> RejectSignal(fixture, line);</div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno"> 661</span> }</div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno"> 662</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string broken: {</div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno"> 663</span> <span class="stringliteral">&quot;SG_&quot;</span>, <span class="stringliteral">&quot;SG_ Value&quot;</span>, <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] ECU&quot;</span>,</div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno"> 664</span> <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] \&quot;\&quot;&quot;</span>,</div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno"> 665</span> <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] \&quot;\&quot; ECU,&quot;</span>,</div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno"> 666</span> <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] \&quot;\&quot; ECU extra&quot;</span>})</div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno"> 667</span> RejectSignal(fixture, broken);</div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno"> 668</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>));</div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno"> 669</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;63&quot;</span>, <span class="stringliteral">&quot;2&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;3&quot;</span>));</div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno"> 670</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;56&quot;</span>, <span class="stringliteral">&quot;2&quot;</span>, <span class="stringliteral">&quot;0+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;3&quot;</span>));</div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno"> 671</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;4294967295&quot;</span>, <span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>));</div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno"> 672</span> RejectSignal(fixture, ordinary, 0U);</div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"> 673</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">char</span> delimiter: {<span class="charliteral">&#39;|&#39;</span>, <span class="charliteral">&#39;@&#39;</span>, <span class="charliteral">&#39;(&#39;</span>, <span class="charliteral">&#39;)&#39;</span>, <span class="charliteral">&#39;[&#39;</span>, <span class="charliteral">&#39;]&#39;</span>, <span class="charliteral">&#39;&quot;&#39;</span>}) {</div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno"> 674</span> std::string line = ordinary;</div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno"> 675</span> line.erase(line.find(delimiter), 1U);</div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno"> 676</span> RejectSignal(fixture, line);</div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno"> 677</span> }</div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"> 678</span>}</div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno"> 679</span> </div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno"> 680</span><span class="keywordtype">void</span> DbcParserTest::validSignals() {</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno"> 681</span> Fixture fixture;</div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno"> 682</span> <span class="keyword">const</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a> signalParser;</div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"> 683</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 8 ECU\n&quot;</span> +</div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"> 684</span> SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>) + <span class="stringliteral">&quot;\n&quot;</span> +</div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"> 685</span> SignalLine(<span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1-&quot;</span>, <span class="stringliteral">&quot;-1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;-255&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;Negative&quot;</span>) + <span class="stringliteral">&quot;\n&quot;</span>);</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> factors = signalParser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno"> 687</span> CHECK(factors.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[0].signals.size() == 2U &amp;&amp;</div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"> 688</span> factors.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[0].signals[0].factor == 0.0 &amp;&amp;</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno"> 689</span> factors.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[0].signals[1].factor == -1.0,</div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"> 690</span> <span class="stringliteral">&quot;Zero and negative factors and equal range boundaries&quot;</span>);</div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span> </div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"> 692</span> <span class="keyword">struct </span>SignalCase {</div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno"> 693</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *start;</div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno"> 694</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *length;</div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"> 695</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *order;</div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno"> 696</span> <span class="keywordtype">unsigned</span> payload;</div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"> 697</span> };</div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno"> 698</span> <span class="keyword">const</span> SignalCase validSignals[] = {</div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"> 699</span> {<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 1U},</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</span> {<span class="stringliteral">&quot;7&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0-&quot;</span>, 1U},</div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno"> 701</span> {<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 8U},</div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"> 702</span> {<span class="stringliteral">&quot;7&quot;</span>, <span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;0-&quot;</span>, 8U},</div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</span> {<span class="stringliteral">&quot;63&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 8U},</div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span> {<span class="stringliteral">&quot;56&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0+&quot;</span>, 8U},</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span> {<span class="stringliteral">&quot;3&quot;</span>, <span class="stringliteral">&quot;12&quot;</span>, <span class="stringliteral">&quot;0+&quot;</span>, 2U},</div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> {<span class="stringliteral">&quot;2039&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 255U}};</div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> SignalCase &amp;test: validSignals) {</div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: &quot;</span> + std::to_string(test.payload) + <span class="stringliteral">&quot; ECU\n&quot;</span> +</div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"> 709</span> SignalLine(test.start, test.length, test.order, <span class="stringliteral">&quot;.5e+1&quot;</span>, <span class="stringliteral">&quot;-2.5E-1&quot;</span>, <span class="stringliteral">&quot;-1.&quot;</span>, <span class="stringliteral">&quot;+2e2&quot;</span>) + <span class="stringliteral">&quot;\n&quot;</span>);</div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"> 711</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> parsed = signalParser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"> 712</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &amp;signal = parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.at(0).signals.at(0);</div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno"> 713</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#ace290724f9801521609aedaa946d61f1">startBit</a>, <span class="keyword">static_cast&lt;</span>std::uint32_t<span class="keyword">&gt;</span>(std::stoul(test.start)));</div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno"> 714</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">length</a>, <span class="keyword">static_cast&lt;</span>std::uint32_t<span class="keyword">&gt;</span>(std::stoul(test.length)));</div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno"> 715</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c">isLittleEndian</a>, test.order[0] == <span class="charliteral">&#39;1&#39;</span>);</div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"> 716</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f">isSigned</a>, test.order[1] == <span class="charliteral">&#39;-&#39;</span>);</div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#ae4f78d99a2750aa564d7eba860171499">factor</a>, 5.0);</div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno"> 718</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#ab7d0769f47aa540656b22e4e49db517e">offset</a>, -0.25);</div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno"> 719</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#ada7bf94fbeaa26bd08c73982b5af255b">minimum</a>, -1.0);</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno"> 720</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#adf1c4331b9eabced0d7fdda40ff0eb52">maximum</a>, 200.0);</div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno"> 721</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &amp;error) { CHECK(<span class="keyword">false</span>, error.what()); }</div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno"> 722</span> }</div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"> 723</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> <span class="stringliteral">&quot;SG_\tValue\t:\t0 | 8 @1+ ( 1 , 0 ) [ 0 | 255 ] \&quot;rpm\&quot; ECU1,\tECU2\n&quot;</span>);</div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno"> 725</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno"> 726</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> parsed = signalParser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno"> 727</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &amp;signal = parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.at(0).signals.at(0);</div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno"> 728</span> CHECK(signal.<a class="code hl_variable" href="structSignalInfo.html#a379e422a00cad56f896cacf60455b088">name</a> == <span class="stringliteral">&quot;Value&quot;</span> &amp;&amp; signal.<a class="code hl_variable" href="structSignalInfo.html#a1f214f03e94ef5794de2d3367bfcbd01">unit</a> == <span class="stringliteral">&quot;rpm&quot;</span> &amp;&amp;</div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno"> 729</span> signal.<a class="code hl_variable" href="structSignalInfo.html#a2c95562fd0b29327a7fd7b1e6feee7f3">receivers</a> == std::vector&lt;std::string&gt;({<span class="stringliteral">&quot;ECU1&quot;</span>, <span class="stringliteral">&quot;ECU2&quot;</span>}),</div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno"> 730</span> <span class="stringliteral">&quot;Signal tabs, spaces, and receiver list&quot;</span>);</div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno"> 731</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &amp;error) { CHECK(<span class="keyword">false</span>, error.what()); }</div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno"> 732</span>}</div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno"> 733</span> </div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno"> 734</span><span class="keywordtype">void</span> DbcParserTest::dispatch() {</div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno"> 735</span> CountingHandler::instances = 0;</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno"> 736</span> CountingHandler::calls = 0;</div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"> 737</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> dispatchDatabase;</div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span> <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> context{dispatchDatabase, <span class="keyword">nullptr</span>};</div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"> 739</span> <a class="code hl_class" href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a> dispatcher;</div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno"> 740</span> dispatcher.RegisterType&lt;CountingHandler&gt;(<span class="stringliteral">&quot;TEST_&quot;</span>);</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> CHECK(dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;TEST_ first&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span> dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;TEST_ second&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno"> 743</span> CountingHandler::instances == 1 &amp;&amp; CountingHandler::calls == 2 &amp;&amp;</div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno"> 744</span> dispatchDatabase.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size() == 2U,</div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"> 745</span> <span class="stringliteral">&quot;Factory dispatch and handler reuse&quot;</span>);</div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno"> 746</span> CHECK(!dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;TEST_OTHER data&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno"> 747</span> !dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;BO_TX_BU_ 1 : ECU;&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno"> 748</span> !dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;VAL_TABLE_ States 0 \&quot;Stopped\&quot;;&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno"> 749</span> CountingHandler::calls == 2,</div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno"> 750</span> <span class="stringliteral">&quot;Exact and unknown keyword dispatch&quot;</span>);</div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"> 751</span>}</div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno"> 752</span> </div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno"> 753</span><span class="keywordtype">void</span> DbcParserTest::independentSessions() {</div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"> 754</span> Fixture fixture;</div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno"> 755</span> <span class="keyword">const</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a> parser;</div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno"> 756</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 First: 8 ECU\n&quot;</span>);</div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno"> 757</span> CHECK(parser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string()).<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size() == 1U, <span class="stringliteral">&quot;First parse&quot;</span>);</div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno"> 758</span> fixture.Write(<span class="stringliteral">&quot;SG_ Speed : invalid\n&quot;</span>);</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"> 759</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno"> 760</span> parser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno"> 761</span> CHECK(<span class="keyword">false</span>, <span class="stringliteral">&quot;Independent parse context&quot;</span>);</div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno"> 762</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno"> 763</span> CHECK(std::string(error.what()).find(<span class="stringliteral">&quot;Signal found before any frame&quot;</span>) !=</div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"> 764</span> std::string::npos,</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span> <span class="stringliteral">&quot;Independent parse context&quot;</span>);</div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span> }</div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span> fixture.Write(<span class="stringliteral">&quot;BO_ 2 Second: 8 ECU\n&quot;</span>);</div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno"> 768</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> recovered = parser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> CHECK(recovered.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size() == 1U &amp;&amp; recovered.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[0].canId == 2U,</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno"> 770</span> <span class="stringliteral">&quot;Fresh parse after error&quot;</span>);</div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"> 771</span>}</div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"> 772</span> </div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno"> 773</span> </div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno"> 774</span><span class="keywordtype">void</span> DbcParserTest::valueDescriptions() {</div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno"> 775</span> Fixture fixture;</div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno"> 776</span> fixture.Write(</div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno"> 777</span> <span class="stringliteral">&quot;VAL_\t256\tState\t0\t\&quot;Off\&quot;\t1 \&quot;On\&quot; 2 \&quot;Error with spaces; and \\\&quot;quotes\\\&quot;\&quot;;\n&quot;</span></div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno"> 778</span> <span class="stringliteral">&quot;BO_ 256 Status: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno"> 779</span> <span class="stringliteral">&quot;SG_ State : 0|8@1+ (2,10) [0|520] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno"> 780</span> <span class="stringliteral">&quot;VAL_ 256 State 3 \&quot;\&quot;;\n&quot;</span></div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno"> 781</span> <span class="stringliteral">&quot;VAL_ 2147483904 State -9223372036854775808 \&quot;Minimum\&quot; -1 \&quot;Negative\&quot; 9223372036854775807 \&quot;Maximum\&quot;;\n&quot;</span></div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno"> 782</span> <span class="stringliteral">&quot;BO_ 2147483904 Extended: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno"> 783</span> <span class="stringliteral">&quot;SG_ State : 0|64@1- (1,0) [-1e20|1e20] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno"> 784</span> <span class="stringliteral">&quot;BO_ 2048 Unsigned: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno"> 785</span> <span class="stringliteral">&quot;SG_ State : 0|64@1+ (1,0) [0|2e20] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"> 786</span> <span class="stringliteral">&quot;VAL_ 2147485696 State 9223372036854775808 \&quot;High\&quot; 18446744073709551615 \&quot;Full\&quot;;\n&quot;</span>);</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno"> 787</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> parsed = <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> <span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> runtime = <a class="code hl_class" href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a>().<a class="code hl_function" href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">Build</a>(parsed);</div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno"> 789</span> <span class="keyword">const</span> std::unique_ptr&lt;TreeNode&gt; tree = <a class="code hl_class" href="classDbcTreeBuilder.html">DbcTreeBuilder</a>().<a class="code hl_function" href="classDbcTreeBuilder.html#a7e57d067d831b14b383947fd125edd4b">Build</a>(parsed);</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno"> 790</span> CHECK(tree-&gt;GetChild(0)-&gt;GetSignal() == <span class="keyword">nullptr</span>, <span class="stringliteral">&quot;Frame node&quot;</span>);</div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno"> 791</span> <span class="keywordflow">for</span> (std::size_t index = 0; index &lt; parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size(); ++index) {</div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"> 792</span> CHECK(tree-&gt;GetChild(index)-&gt;GetChild(0)-&gt;GetSignal()-&gt;valueDescriptions ==</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno"> 793</span> parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[index].signals[0].valueDescriptions &amp;&amp;</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"> 794</span> runtime.<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>()[index].signals[0].valueDescriptions ==</div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno"> 795</span> parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[index].signals[0].valueDescriptions,</div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno"> 796</span> <span class="stringliteral">&quot;All mappings survive both builders&quot;</span>);</div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno"> 797</span> }</div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"> 798</span> CHECK(tree-&gt;GetChild(0)-&gt;GetChild(0)-&gt;GetSignal()-&gt;valueDescriptions ==</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno"> 799</span> runtime.<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>()[0].signals[0].valueDescriptions,</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno"> 800</span> <span class="stringliteral">&quot;Both builders preserve descriptions&quot;</span>);</div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"> 801</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> frame;</div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno"> 802</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = 256;</div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"> 803</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>.resize(8);</div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</span> <span class="keyword">const</span> std::string expected[] = {<span class="stringliteral">&quot;Off&quot;</span>, <span class="stringliteral">&quot;On&quot;</span>, <span class="stringliteral">&quot;Error with spaces; and \&quot;quotes\&quot;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>};</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno"> 805</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> value = 0; value &lt; 5; ++value) {</div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno"> 806</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>[0] = value;</div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"> 807</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> decoded = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(runtime, frame).signals[0];</div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno"> 808</span> CHECK(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a> &amp;&amp; decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a> == value * 2 + 10, <span class="stringliteral">&quot;Numeric scaling unchanged&quot;</span>);</div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno"> 809</span> <span class="keyword">const</span> std::string *description = decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>();</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"> 810</span> CHECK(value &lt; 4 ? description &amp;&amp; *description == expected[value] : !description,</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"> 811</span> <span class="stringliteral">&quot;Raw lookup and unknown value&quot;</span>);</div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno"> 812</span> }</div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"> 813</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">isExtended</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> <span class="keyword">struct </span>Boundary {</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span> std::uint64_t bits;</div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno"> 816</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *description;</div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno"> 817</span> };</div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno"> 818</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> Boundary &amp;test: {Boundary{0x8000000000000000ULL, <span class="stringliteral">&quot;Minimum&quot;</span>},</div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno"> 819</span> Boundary{0xFFFFFFFFFFFFFFFFULL, <span class="stringliteral">&quot;Negative&quot;</span>},</div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno"> 820</span> Boundary{0x7FFFFFFFFFFFFFFFULL, <span class="stringliteral">&quot;Maximum&quot;</span>}}) {</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"> 821</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">byte</span> = 0; <span class="keywordtype">byte</span> &lt; 8; ++byte)</div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"> 822</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>[<span class="keywordtype">byte</span>] = <span class="keyword">static_cast&lt;</span>std::uint8_t<span class="keyword">&gt;</span>(test.bits &gt;&gt; (<span class="keywordtype">byte</span> * 8));</div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"> 823</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> decoded = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(runtime, frame).signals[0];</div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno"> 824</span> CHECK(decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>() &amp;&amp; *decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>() == test.description,</div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno"> 825</span> <span class="stringliteral">&quot;Signed boundaries and distinct extended frame&quot;</span>);</div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno"> 826</span> }</div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno"> 827</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = 2048;</div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"> 828</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> Boundary &amp;test: {Boundary{0x8000000000000000ULL, <span class="stringliteral">&quot;High&quot;</span>},</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno"> 829</span> Boundary{0xFFFFFFFFFFFFFFFFULL, <span class="stringliteral">&quot;Full&quot;</span>}}) {</div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno"> 830</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">byte</span> = 0; <span class="keywordtype">byte</span> &lt; 8; ++byte)</div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno"> 831</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>[<span class="keywordtype">byte</span>] = <span class="keyword">static_cast&lt;</span>std::uint8_t<span class="keyword">&gt;</span>(test.bits &gt;&gt; (<span class="keywordtype">byte</span> * 8));</div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno"> 832</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> decoded = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(runtime, frame).signals[0];</div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno"> 833</span> CHECK(decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>() &amp;&amp; *decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>() == test.description,</div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno"> 834</span> <span class="stringliteral">&quot;Unsigned boundaries&quot;</span>);</div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno"> 835</span> }</div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno"> 836</span> CHECK(FindValueDescription(runtime.<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>()[0].signals[0].valueDescriptions, std::int64_t(1)) != <span class="keyword">nullptr</span>,</div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno"> 837</span> <span class="stringliteral">&quot;Nonnegative signed lookup matches unsigned key&quot;</span>);</div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno"> 838</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>.clear();</div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno"> 839</span> CHECK(!<a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().Decode(runtime, frame).signals[0].GetValueDescription(), <span class="stringliteral">&quot;Invalid decode has no description&quot;</span>);</div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno"> 840</span>}</div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"> 841</span> </div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno"> 842</span><span class="keywordtype">void</span> DbcParserTest::invalidValueDescriptions() {</div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno"> 843</span> Fixture fixture;</div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno"> 844</span> <span class="keyword">const</span> std::string definitions = <span class="stringliteral">&quot;BO_ 1 Frame: 8 ECU\nSG_ State : 0|64@1+ (1,0) [0|2e20] \&quot;\&quot; ECU\n&quot;</span>;</div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno"> 845</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string statement: {</div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno"> 846</span> <span class="stringliteral">&quot;VAL_&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State;&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State ;&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot;&quot;</span>,</div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno"> 847</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot;; junk&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State 0 Off;&quot;</span>,</div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno"> 848</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Unclosed;&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot;1 \&quot;On\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno"> 849</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot; 00 \&quot;Duplicate\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno"> 850</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot; -0 \&quot;Duplicate\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno"> 851</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot;;\nVAL_ 1 State 0 \&quot;Duplicate\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno"> 852</span> <span class="stringliteral">&quot;VAL_ 2 State 0 \&quot;Missing frame\&quot;;&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 Missing 0 \&quot;Missing signal\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno"> 853</span> <span class="stringliteral">&quot;VAL_ -1 State 0 \&quot;Bad ID\&quot;;&quot;</span>, <span class="stringliteral">&quot;VAL_ 536870912 State 0 \&quot;Bad ID\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno"> 854</span> <span class="stringliteral">&quot;VAL_ 4294967296 State 0 \&quot;Bad ID\&quot;;&quot;</span>, <span class="stringliteral">&quot;VAL_ Environment 0 \&quot;Unsupported\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno"> 855</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Bad\\q escape\&quot;;&quot;</span>}) {</div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno"> 856</span> fixture.Write(definitions + statement + <span class="charliteral">&#39;\n&#39;</span>);</div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno"> 857</span> <span class="keyword">const</span> <span class="keywordtype">int</span> line = statement.find(<span class="charliteral">&#39;\n&#39;</span>) == std::string::npos ? 3 : 4;</div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno"> 858</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno"> 859</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno"> 860</span> CHECK(<span class="keyword">false</span>, statement);</div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno"> 861</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno"> 862</span> CHECK(std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:&quot;</span> + std::to_string(line) + <span class="stringliteral">&quot;: &quot;</span>) == 0,</div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno"> 863</span> statement + <span class="stringliteral">&quot; &quot;</span> + error.what());</div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno"> 864</span> }</div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno"> 865</span> }</div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"> 866</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string suffix: {</div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno"> 867</span> <span class="stringliteral">&quot;BO_ 1 Other: 8 ECU\n&quot;</span>, <span class="comment">// Duplicate frame definition.</span></div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno"> 868</span> <span class="stringliteral">&quot;SG_ State : 0|8@1+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span>,<span class="comment">// Duplicate signal definition.</span></div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno"> 869</span> <span class="stringliteral">&quot;&quot;</span>}) {</div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno"> 870</span> fixture.Write(<span class="stringliteral">&quot;VAL_ 1 &quot;</span> + std::string(suffix.empty() ? <span class="stringliteral">&quot;Missing&quot;</span> : <span class="stringliteral">&quot;State&quot;</span>) +</div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno"> 871</span> <span class="stringliteral">&quot; 0 \&quot;Description\&quot;;\n&quot;</span> + definitions + suffix);</div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno"> 872</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno"> 873</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno"> 874</span> CHECK(<span class="keyword">false</span>, <span class="stringliteral">&quot;Missing reference or duplicate definition&quot;</span>);</div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno"> 875</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno"> 876</span> <span class="keyword">const</span> std::string line = suffix.empty() ? <span class="stringliteral">&quot;1&quot;</span> : <span class="stringliteral">&quot;4&quot;</span>;</div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno"> 877</span> CHECK(std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:&quot;</span> + line + <span class="stringliteral">&quot;: &quot;</span>) == 0,</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno"> 878</span> <span class="stringliteral">&quot;Error retains the reference or duplicate definition source location&quot;</span>);</div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno"> 879</span> }</div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno"> 880</span> }</div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno"> 881</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string number: {<span class="stringliteral">&quot;+1&quot;</span>, <span class="stringliteral">&quot;1x&quot;</span>, <span class="stringliteral">&quot;0x10&quot;</span>, <span class="stringliteral">&quot;1.5&quot;</span>, <span class="stringliteral">&quot;1e2&quot;</span>, <span class="stringliteral">&quot;--1&quot;</span>,</div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno"> 882</span> <span class="stringliteral">&quot;-9223372036854775809&quot;</span>, <span class="stringliteral">&quot;18446744073709551616&quot;</span>}) {</div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno"> 883</span> fixture.Write(<span class="stringliteral">&quot;VAL_ 1 State &quot;</span> + number + <span class="stringliteral">&quot; \&quot;Bad\&quot;;\n&quot;</span> + definitions);</div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno"> 884</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno"> 885</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno"> 886</span> CHECK(<span class="keyword">false</span>, number);</div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno"> 887</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno"> 888</span> CHECK(std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:1: &quot;</span>) == 0, number);</div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno"> 889</span> }</div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno"> 890</span> }</div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno"> 891</span>}</div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno"> 892</span> </div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno"> 893</span><span class="keywordtype">int</span> RunParserTests(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) {</div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno"> 894</span> DbcParserTest tests;</div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno"> 895</span> <span class="keywordflow">return</span> QTest::qExec(&amp;tests, argc, argv);</div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno"> 896</span>}</div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno"> 897</span> </div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno"> 898</span><span class="preprocessor">#include &quot;dbc_parser_test.moc&quot;</span></div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno"> 606</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, runtime = <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(definitions));</div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"> 607</span> definitions[0].signals.pop_back();</div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno"> 608</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, runtime = <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(definitions));</div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno"> 609</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 2 ECU\n\n&quot;</span></div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno"> 610</span> <span class="stringliteral">&quot;SG_ Branch m2 : 8|8@1+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"> 611</span> <span class="stringliteral">&quot;SG_ Mode M : 0|1@1+ (1,0) [0|1] \&quot;\&quot; ECU\n&quot;</span>);</div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno"> 612</span> <span class="keywordtype">bool</span> rejected = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno"> 613</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno"> 614</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno"> 615</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"> 616</span> rejected = std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:3: &quot;</span>) == 0U;</div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno"> 617</span> }</div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno"> 618</span> CHECK(rejected, <span class="stringliteral">&quot;Deferred validation reports branch source line&quot;</span>);</div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"> 619</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 2 ECU\n&quot;</span></div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno"> 620</span> <span class="stringliteral">&quot;SG_ A : 8|8@1+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"> 621</span> <span class="stringliteral">&quot;SG_ B : 15|8@0+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span>);</div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno"> 622</span> rejected = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno"> 623</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno"> 624</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno"> 625</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;) {</div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno"> 626</span> rejected = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno"> 627</span> }</div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno"> 628</span> CHECK(rejected, <span class="stringliteral">&quot;Ordinary overlapping signals rejected&quot;</span>);</div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"> 629</span>}</div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno"> 630</span> </div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno"> 631</span><span class="keywordtype">void</span> DbcParserTest::invalidSignals() {</div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"> 632</span> Fixture fixture;</div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno"> 633</span> <span class="keyword">const</span> std::string ordinary = SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>);</div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno"> 634</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string value: {<span class="stringliteral">&quot;-1&quot;</span>, <span class="stringliteral">&quot;+1&quot;</span>, <span class="stringliteral">&quot;0junk&quot;</span>, <span class="stringliteral">&quot;0x10&quot;</span>, <span class="stringliteral">&quot;1.5&quot;</span>,</div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno"> 635</span> <span class="stringliteral">&quot;4294967296&quot;</span>, <span class="stringliteral">&quot;999999999999999999999&quot;</span>}) {</div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno"> 636</span> RejectSignal(fixture, SignalLine(value, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno"> 637</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, value, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"> 638</span> }</div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno"> 639</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string length: {<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;65&quot;</span>})</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno"> 640</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, length, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno"> 641</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string order: {<span class="stringliteral">&quot;2+&quot;</span>, <span class="stringliteral">&quot;9-&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1x&quot;</span>, <span class="stringliteral">&quot;1++&quot;</span>, <span class="stringliteral">&quot;01+&quot;</span>})</div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno"> 642</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, order, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno"> 643</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string value: {<span class="stringliteral">&quot;1junk&quot;</span>, <span class="stringliteral">&quot;nan&quot;</span>, <span class="stringliteral">&quot;NaN&quot;</span>, <span class="stringliteral">&quot;inf&quot;</span>, <span class="stringliteral">&quot;-inf&quot;</span>, <span class="stringliteral">&quot;1e999&quot;</span>, <span class="stringliteral">&quot;1e-999&quot;</span>, <span class="stringliteral">&quot;0x1p2&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;1e&quot;</span>, <span class="stringliteral">&quot;1.2.3&quot;</span>}) {</div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno"> 644</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, value, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"> 645</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, value, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno"> 646</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, value, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno"> 647</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, value));</div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno"> 648</span> }</div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno"> 649</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;2&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>));</div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno"> 650</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string name: {<span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;Two Names&quot;</span>, <span class="stringliteral">&quot;Value m1M&quot;</span>}) {</div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"> 651</span> std::string line = ordinary;</div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno"> 652</span> line.replace(4U, 5U, name);</div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno"> 653</span> RejectSignal(fixture, line);</div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno"> 654</span> }</div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno"> 655</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string broken: {</div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno"> 656</span> <span class="stringliteral">&quot;SG_&quot;</span>, <span class="stringliteral">&quot;SG_ Value&quot;</span>, <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] ECU&quot;</span>,</div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno"> 657</span> <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] \&quot;\&quot;&quot;</span>,</div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno"> 658</span> <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] \&quot;\&quot; ECU,&quot;</span>,</div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno"> 659</span> <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] \&quot;\&quot; ECU extra&quot;</span>})</div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno"> 660</span> RejectSignal(fixture, broken);</div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno"> 661</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>));</div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno"> 662</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;63&quot;</span>, <span class="stringliteral">&quot;2&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;3&quot;</span>));</div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno"> 663</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;56&quot;</span>, <span class="stringliteral">&quot;2&quot;</span>, <span class="stringliteral">&quot;0+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;3&quot;</span>));</div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno"> 664</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;4294967295&quot;</span>, <span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>));</div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno"> 665</span> RejectSignal(fixture, ordinary, 0U);</div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno"> 666</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">char</span> delimiter: {<span class="charliteral">&#39;|&#39;</span>, <span class="charliteral">&#39;@&#39;</span>, <span class="charliteral">&#39;(&#39;</span>, <span class="charliteral">&#39;)&#39;</span>, <span class="charliteral">&#39;[&#39;</span>, <span class="charliteral">&#39;]&#39;</span>, <span class="charliteral">&#39;&quot;&#39;</span>}) {</div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno"> 667</span> std::string line = ordinary;</div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno"> 668</span> line.erase(line.find(delimiter), 1U);</div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno"> 669</span> RejectSignal(fixture, line);</div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno"> 670</span> }</div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno"> 671</span>}</div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno"> 672</span> </div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"> 673</span><span class="keywordtype">void</span> DbcParserTest::validSignals() {</div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno"> 674</span> Fixture fixture;</div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno"> 675</span> <span class="keyword">const</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a> signalParser;</div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno"> 676</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 8 ECU\n&quot;</span> +</div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno"> 677</span> SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>) + <span class="stringliteral">&quot;\n&quot;</span> +</div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"> 678</span> SignalLine(<span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1-&quot;</span>, <span class="stringliteral">&quot;-1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;-255&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;Negative&quot;</span>) + <span class="stringliteral">&quot;\n&quot;</span>);</div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno"> 679</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> factors = signalParser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno"> 680</span> CHECK(factors.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[0].signals.size() == 2U &amp;&amp;</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno"> 681</span> factors.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[0].signals[0].factor == 0.0 &amp;&amp;</div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno"> 682</span> factors.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[0].signals[1].factor == -1.0,</div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"> 683</span> <span class="stringliteral">&quot;Zero and negative factors and equal range boundaries&quot;</span>);</div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"> 684</span> </div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"> 685</span> <span class="keyword">struct </span>SignalCase {</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *start;</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno"> 687</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *length;</div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"> 688</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *order;</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno"> 689</span> <span class="keywordtype">unsigned</span> payload;</div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"> 690</span> };</div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span> <span class="keyword">const</span> SignalCase validSignals[] = {</div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"> 692</span> {<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 1U},</div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno"> 693</span> {<span class="stringliteral">&quot;7&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0-&quot;</span>, 1U},</div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno"> 694</span> {<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 8U},</div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"> 695</span> {<span class="stringliteral">&quot;7&quot;</span>, <span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;0-&quot;</span>, 8U},</div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno"> 696</span> {<span class="stringliteral">&quot;63&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 8U},</div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"> 697</span> {<span class="stringliteral">&quot;56&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0+&quot;</span>, 8U},</div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno"> 698</span> {<span class="stringliteral">&quot;3&quot;</span>, <span class="stringliteral">&quot;12&quot;</span>, <span class="stringliteral">&quot;0+&quot;</span>, 2U},</div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"> 699</span> {<span class="stringliteral">&quot;2039&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 255U}};</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> SignalCase &amp;test: validSignals) {</div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno"> 701</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: &quot;</span> + std::to_string(test.payload) + <span class="stringliteral">&quot; ECU\n&quot;</span> +</div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"> 702</span> SignalLine(test.start, test.length, test.order, <span class="stringliteral">&quot;.5e+1&quot;</span>, <span class="stringliteral">&quot;-2.5E-1&quot;</span>, <span class="stringliteral">&quot;-1.&quot;</span>, <span class="stringliteral">&quot;+2e2&quot;</span>) + <span class="stringliteral">&quot;\n&quot;</span>);</div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> parsed = signalParser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &amp;signal = parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.at(0).signals.at(0);</div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#ace290724f9801521609aedaa946d61f1">startBit</a>, <span class="keyword">static_cast&lt;</span>std::uint32_t<span class="keyword">&gt;</span>(std::stoul(test.start)));</div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">length</a>, <span class="keyword">static_cast&lt;</span>std::uint32_t<span class="keyword">&gt;</span>(std::stoul(test.length)));</div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c">isLittleEndian</a>, test.order[0] == <span class="charliteral">&#39;1&#39;</span>);</div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"> 709</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f">isSigned</a>, test.order[1] == <span class="charliteral">&#39;-&#39;</span>);</div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#ae4f78d99a2750aa564d7eba860171499">factor</a>, 5.0);</div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"> 711</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#ab7d0769f47aa540656b22e4e49db517e">offset</a>, -0.25);</div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"> 712</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#ada7bf94fbeaa26bd08c73982b5af255b">minimum</a>, -1.0);</div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno"> 713</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#adf1c4331b9eabced0d7fdda40ff0eb52">maximum</a>, 200.0);</div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno"> 714</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &amp;error) { CHECK(<span class="keyword">false</span>, error.what()); }</div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno"> 715</span> }</div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"> 716</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span> <span class="stringliteral">&quot;SG_\tValue\t:\t0 | 8 @1+ ( 1 , 0 ) [ 0 | 255 ] \&quot;rpm\&quot; ECU1,\tECU2\n&quot;</span>);</div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno"> 718</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno"> 719</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> parsed = signalParser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno"> 720</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &amp;signal = parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.at(0).signals.at(0);</div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno"> 721</span> CHECK(signal.<a class="code hl_variable" href="structSignalInfo.html#a379e422a00cad56f896cacf60455b088">name</a> == <span class="stringliteral">&quot;Value&quot;</span> &amp;&amp; signal.<a class="code hl_variable" href="structSignalInfo.html#a1f214f03e94ef5794de2d3367bfcbd01">unit</a> == <span class="stringliteral">&quot;rpm&quot;</span> &amp;&amp;</div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno"> 722</span> signal.<a class="code hl_variable" href="structSignalInfo.html#a2c95562fd0b29327a7fd7b1e6feee7f3">receivers</a> == std::vector&lt;std::string&gt;({<span class="stringliteral">&quot;ECU1&quot;</span>, <span class="stringliteral">&quot;ECU2&quot;</span>}),</div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"> 723</span> <span class="stringliteral">&quot;Signal tabs, spaces, and receiver list&quot;</span>);</div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &amp;error) { CHECK(<span class="keyword">false</span>, error.what()); }</div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno"> 725</span>}</div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno"> 726</span> </div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno"> 727</span><span class="keywordtype">void</span> DbcParserTest::dispatch() {</div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno"> 728</span> CountingHandler::instances = 0;</div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno"> 729</span> CountingHandler::calls = 0;</div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno"> 730</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> dispatchDatabase;</div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno"> 731</span> <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> context{dispatchDatabase, <span class="keyword">nullptr</span>};</div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno"> 732</span> <a class="code hl_class" href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a> dispatcher;</div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno"> 733</span> dispatcher.RegisterType&lt;CountingHandler&gt;(<span class="stringliteral">&quot;TEST_&quot;</span>);</div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno"> 734</span> CHECK(dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;TEST_ first&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno"> 735</span> dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;TEST_ second&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno"> 736</span> CountingHandler::instances == 1 &amp;&amp; CountingHandler::calls == 2 &amp;&amp;</div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"> 737</span> dispatchDatabase.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size() == 2U,</div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span> <span class="stringliteral">&quot;Factory dispatch and handler reuse&quot;</span>);</div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"> 739</span> CHECK(!dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;TEST_OTHER data&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno"> 740</span> !dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;BO_TX_BU_ 1 : ECU;&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> !dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;VAL_TABLE_ States 0 \&quot;Stopped\&quot;;&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span> CountingHandler::calls == 2,</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno"> 743</span> <span class="stringliteral">&quot;Exact and unknown keyword dispatch&quot;</span>);</div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno"> 744</span>}</div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"> 745</span> </div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno"> 746</span><span class="keywordtype">void</span> DbcParserTest::independentSessions() {</div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno"> 747</span> Fixture fixture;</div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno"> 748</span> <span class="keyword">const</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a> parser;</div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno"> 749</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 First: 8 ECU\n&quot;</span>);</div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno"> 750</span> CHECK(parser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string()).<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size() == 1U, <span class="stringliteral">&quot;First parse&quot;</span>);</div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"> 751</span> fixture.Write(<span class="stringliteral">&quot;SG_ Speed : invalid\n&quot;</span>);</div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno"> 752</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno"> 753</span> parser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"> 754</span> CHECK(<span class="keyword">false</span>, <span class="stringliteral">&quot;Independent parse context&quot;</span>);</div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno"> 755</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno"> 756</span> CHECK(std::string(error.what()).find(<span class="stringliteral">&quot;Signal found before any frame&quot;</span>) !=</div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno"> 757</span> std::string::npos,</div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno"> 758</span> <span class="stringliteral">&quot;Independent parse context&quot;</span>);</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"> 759</span> }</div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno"> 760</span> fixture.Write(<span class="stringliteral">&quot;BO_ 2 Second: 8 ECU\n&quot;</span>);</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno"> 761</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> recovered = parser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno"> 762</span> CHECK(recovered.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size() == 1U &amp;&amp; recovered.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[0].canId == 2U,</div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno"> 763</span> <span class="stringliteral">&quot;Fresh parse after error&quot;</span>);</div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"> 764</span>}</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span> </div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span> </div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span><span class="keywordtype">void</span> DbcParserTest::valueDescriptions() {</div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno"> 768</span> Fixture fixture;</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> fixture.Write(</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno"> 770</span> <span class="stringliteral">&quot;VAL_\t256\tState\t0\t\&quot;Off\&quot;\t1 \&quot;On\&quot; 2 \&quot;Error with spaces; and \\\&quot;quotes\\\&quot;\&quot;;\n&quot;</span></div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"> 771</span> <span class="stringliteral">&quot;BO_ 256 Status: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"> 772</span> <span class="stringliteral">&quot;SG_ State : 0|8@1+ (2,10) [0|520] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno"> 773</span> <span class="stringliteral">&quot;VAL_ 256 State 3 \&quot;\&quot;;\n&quot;</span></div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno"> 774</span> <span class="stringliteral">&quot;VAL_ 2147483904 State -9223372036854775808 \&quot;Minimum\&quot; -1 \&quot;Negative\&quot; 9223372036854775807 \&quot;Maximum\&quot;;\n&quot;</span></div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno"> 775</span> <span class="stringliteral">&quot;BO_ 2147483904 Extended: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno"> 776</span> <span class="stringliteral">&quot;SG_ State : 0|64@1- (1,0) [-1e20|1e20] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno"> 777</span> <span class="stringliteral">&quot;BO_ 2048 Unsigned: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno"> 778</span> <span class="stringliteral">&quot;SG_ State : 0|64@1+ (1,0) [0|2e20] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno"> 779</span> <span class="stringliteral">&quot;VAL_ 2147485696 State 9223372036854775808 \&quot;High\&quot; 18446744073709551615 \&quot;Full\&quot;;\n&quot;</span>);</div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno"> 780</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> parsed = <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno"> 781</span> <span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> runtime = <a class="code hl_class" href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a>().<a class="code hl_function" href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">Build</a>(parsed);</div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno"> 782</span> <span class="keyword">const</span> std::unique_ptr&lt;TreeNode&gt; tree = <a class="code hl_class" href="classDbcTreeBuilder.html">DbcTreeBuilder</a>().<a class="code hl_function" href="classDbcTreeBuilder.html#a7e57d067d831b14b383947fd125edd4b">Build</a>(parsed);</div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno"> 783</span> CHECK(tree-&gt;GetChild(0)-&gt;GetSignal() == <span class="keyword">nullptr</span>, <span class="stringliteral">&quot;Frame node&quot;</span>);</div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno"> 784</span> <span class="keywordflow">for</span> (std::size_t index = 0; index &lt; parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size(); ++index) {</div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno"> 785</span> CHECK(tree-&gt;GetChild(index)-&gt;GetChild(0)-&gt;GetSignal()-&gt;valueDescriptions ==</div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"> 786</span> parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[index].signals[0].valueDescriptions &amp;&amp;</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno"> 787</span> runtime.<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>()[index].signals[0].valueDescriptions ==</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[index].signals[0].valueDescriptions,</div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno"> 789</span> <span class="stringliteral">&quot;All mappings survive both builders&quot;</span>);</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno"> 790</span> }</div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno"> 791</span> CHECK(tree-&gt;GetChild(0)-&gt;GetChild(0)-&gt;GetSignal()-&gt;valueDescriptions ==</div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"> 792</span> runtime.<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>()[0].signals[0].valueDescriptions,</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno"> 793</span> <span class="stringliteral">&quot;Both builders preserve descriptions&quot;</span>);</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"> 794</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> frame;</div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno"> 795</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = 256;</div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno"> 796</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>.resize(8);</div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno"> 797</span> <span class="keyword">const</span> std::string expected[] = {<span class="stringliteral">&quot;Off&quot;</span>, <span class="stringliteral">&quot;On&quot;</span>, <span class="stringliteral">&quot;Error with spaces; and \&quot;quotes\&quot;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>};</div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"> 798</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> value = 0; value &lt; 5; ++value) {</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno"> 799</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>[0] = value;</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno"> 800</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> decoded = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(runtime, frame).signals[0];</div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"> 801</span> CHECK(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a> &amp;&amp; decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a> == value * 2 + 10, <span class="stringliteral">&quot;Numeric scaling unchanged&quot;</span>);</div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno"> 802</span> <span class="keyword">const</span> std::string *description = decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>();</div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"> 803</span> CHECK(value &lt; 4 ? description &amp;&amp; *description == expected[value] : !description,</div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</span> <span class="stringliteral">&quot;Raw lookup and unknown value&quot;</span>);</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno"> 805</span> }</div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno"> 806</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">isExtended</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"> 807</span> <span class="keyword">struct </span>Boundary {</div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno"> 808</span> std::uint64_t bits;</div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno"> 809</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *description;</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"> 810</span> };</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"> 811</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> Boundary &amp;test: {Boundary{0x8000000000000000ULL, <span class="stringliteral">&quot;Minimum&quot;</span>},</div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno"> 812</span> Boundary{0xFFFFFFFFFFFFFFFFULL, <span class="stringliteral">&quot;Negative&quot;</span>},</div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"> 813</span> Boundary{0x7FFFFFFFFFFFFFFFULL, <span class="stringliteral">&quot;Maximum&quot;</span>}}) {</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">byte</span> = 0; <span class="keywordtype">byte</span> &lt; 8; ++byte)</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>[<span class="keywordtype">byte</span>] = <span class="keyword">static_cast&lt;</span>std::uint8_t<span class="keyword">&gt;</span>(test.bits &gt;&gt; (<span class="keywordtype">byte</span> * 8));</div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno"> 816</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> decoded = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(runtime, frame).signals[0];</div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno"> 817</span> CHECK(decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>() &amp;&amp; *decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>() == test.description,</div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno"> 818</span> <span class="stringliteral">&quot;Signed boundaries and distinct extended frame&quot;</span>);</div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno"> 819</span> }</div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno"> 820</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = 2048;</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"> 821</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> Boundary &amp;test: {Boundary{0x8000000000000000ULL, <span class="stringliteral">&quot;High&quot;</span>},</div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"> 822</span> Boundary{0xFFFFFFFFFFFFFFFFULL, <span class="stringliteral">&quot;Full&quot;</span>}}) {</div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"> 823</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">byte</span> = 0; <span class="keywordtype">byte</span> &lt; 8; ++byte)</div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno"> 824</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>[<span class="keywordtype">byte</span>] = <span class="keyword">static_cast&lt;</span>std::uint8_t<span class="keyword">&gt;</span>(test.bits &gt;&gt; (<span class="keywordtype">byte</span> * 8));</div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno"> 825</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> decoded = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(runtime, frame).signals[0];</div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno"> 826</span> CHECK(decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>() &amp;&amp; *decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>() == test.description,</div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno"> 827</span> <span class="stringliteral">&quot;Unsigned boundaries&quot;</span>);</div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"> 828</span> }</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno"> 829</span> CHECK(FindValueDescription(runtime.<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>()[0].signals[0].valueDescriptions, std::int64_t(1)) != <span class="keyword">nullptr</span>,</div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno"> 830</span> <span class="stringliteral">&quot;Nonnegative signed lookup matches unsigned key&quot;</span>);</div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno"> 831</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>.clear();</div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno"> 832</span> CHECK(!<a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().Decode(runtime, frame).signals[0].GetValueDescription(), <span class="stringliteral">&quot;Invalid decode has no description&quot;</span>);</div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno"> 833</span>}</div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno"> 834</span> </div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno"> 835</span><span class="keywordtype">void</span> DbcParserTest::invalidValueDescriptions() {</div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno"> 836</span> Fixture fixture;</div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno"> 837</span> <span class="keyword">const</span> std::string definitions = <span class="stringliteral">&quot;BO_ 1 Frame: 8 ECU\nSG_ State : 0|64@1+ (1,0) [0|2e20] \&quot;\&quot; ECU\n&quot;</span>;</div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno"> 838</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string statement: {</div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno"> 839</span> <span class="stringliteral">&quot;VAL_&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State;&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State ;&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot;&quot;</span>,</div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno"> 840</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot;; junk&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State 0 Off;&quot;</span>,</div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"> 841</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Unclosed;&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot;1 \&quot;On\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno"> 842</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot; 00 \&quot;Duplicate\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno"> 843</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot; -0 \&quot;Duplicate\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno"> 844</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot;;\nVAL_ 1 State 0 \&quot;Duplicate\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno"> 845</span> <span class="stringliteral">&quot;VAL_ 2 State 0 \&quot;Missing frame\&quot;;&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 Missing 0 \&quot;Missing signal\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno"> 846</span> <span class="stringliteral">&quot;VAL_ -1 State 0 \&quot;Bad ID\&quot;;&quot;</span>, <span class="stringliteral">&quot;VAL_ 536870912 State 0 \&quot;Bad ID\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno"> 847</span> <span class="stringliteral">&quot;VAL_ 4294967296 State 0 \&quot;Bad ID\&quot;;&quot;</span>, <span class="stringliteral">&quot;VAL_ Environment 0 \&quot;Unsupported\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno"> 848</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Bad\\q escape\&quot;;&quot;</span>}) {</div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno"> 849</span> fixture.Write(definitions + statement + <span class="charliteral">&#39;\n&#39;</span>);</div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno"> 850</span> <span class="keyword">const</span> <span class="keywordtype">int</span> line = statement.find(<span class="charliteral">&#39;\n&#39;</span>) == std::string::npos ? 3 : 4;</div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno"> 851</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno"> 852</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno"> 853</span> CHECK(<span class="keyword">false</span>, statement);</div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno"> 854</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno"> 855</span> CHECK(std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:&quot;</span> + std::to_string(line) + <span class="stringliteral">&quot;: &quot;</span>) == 0,</div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno"> 856</span> statement + <span class="stringliteral">&quot; &quot;</span> + error.what());</div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno"> 857</span> }</div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno"> 858</span> }</div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno"> 859</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string suffix: {</div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno"> 860</span> <span class="stringliteral">&quot;BO_ 1 Other: 8 ECU\n&quot;</span>, <span class="comment">// Duplicate frame definition.</span></div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno"> 861</span> <span class="stringliteral">&quot;SG_ State : 0|8@1+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span>,<span class="comment">// Duplicate signal definition.</span></div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno"> 862</span> <span class="stringliteral">&quot;&quot;</span>}) {</div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno"> 863</span> fixture.Write(<span class="stringliteral">&quot;VAL_ 1 &quot;</span> + std::string(suffix.empty() ? <span class="stringliteral">&quot;Missing&quot;</span> : <span class="stringliteral">&quot;State&quot;</span>) +</div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno"> 864</span> <span class="stringliteral">&quot; 0 \&quot;Description\&quot;;\n&quot;</span> + definitions + suffix);</div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno"> 865</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"> 866</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno"> 867</span> CHECK(<span class="keyword">false</span>, <span class="stringliteral">&quot;Missing reference or duplicate definition&quot;</span>);</div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno"> 868</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno"> 869</span> <span class="keyword">const</span> std::string line = suffix.empty() ? <span class="stringliteral">&quot;1&quot;</span> : <span class="stringliteral">&quot;4&quot;</span>;</div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno"> 870</span> CHECK(std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:&quot;</span> + line + <span class="stringliteral">&quot;: &quot;</span>) == 0,</div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno"> 871</span> <span class="stringliteral">&quot;Error retains the reference or duplicate definition source location&quot;</span>);</div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno"> 872</span> }</div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno"> 873</span> }</div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno"> 874</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string number: {<span class="stringliteral">&quot;+1&quot;</span>, <span class="stringliteral">&quot;1x&quot;</span>, <span class="stringliteral">&quot;0x10&quot;</span>, <span class="stringliteral">&quot;1.5&quot;</span>, <span class="stringliteral">&quot;1e2&quot;</span>, <span class="stringliteral">&quot;--1&quot;</span>,</div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno"> 875</span> <span class="stringliteral">&quot;-9223372036854775809&quot;</span>, <span class="stringliteral">&quot;18446744073709551616&quot;</span>}) {</div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno"> 876</span> fixture.Write(<span class="stringliteral">&quot;VAL_ 1 State &quot;</span> + number + <span class="stringliteral">&quot; \&quot;Bad\&quot;;\n&quot;</span> + definitions);</div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno"> 877</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno"> 878</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno"> 879</span> CHECK(<span class="keyword">false</span>, number);</div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno"> 880</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno"> 881</span> CHECK(std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:1: &quot;</span>) == 0, number);</div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno"> 882</span> }</div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno"> 883</span> }</div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno"> 884</span>}</div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno"> 885</span> </div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno"> 886</span><span class="keywordtype">int</span> RunParserTests(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) {</div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno"> 887</span> DbcParserTest tests;</div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno"> 888</span> <span class="keywordflow">return</span> QTest::qExec(&amp;tests, argc, argv);</div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno"> 889</span>}</div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno"> 890</span> </div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno"> 891</span><span class="preprocessor">#include &quot;dbc_parser_test.moc&quot;</span></div>
<div class="ttc" id="aclassDbcDecodeBuilder_html"><div class="ttname"><a href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a></div><div class="ttdoc">Converts parsed DBC data into runtime decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decode__builder_8h_source.html#l00021">dbc_decode_builder.h:21</a></div></div>
<div class="ttc" id="aclassDbcDecodeBuilder_html_a2bc6386dfb5e58976c42e22c19ec471b"><div class="ttname"><a href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">DbcDecodeBuilder::Build</a></div><div class="ttdeci">DecodeDatabase Build(const DbcDatabase &amp;source) const</div><div class="ttdoc">Build runtime decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decode__builder_8cpp_source.html#l00015">dbc_decode_builder.cpp:15</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html"><div class="ttname"><a href="classDbcDecoder.html">DbcDecoder</a></div><div class="ttdoc">Runtime CAN decoder using prebuilt decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00084">dbc_decoder.h:84</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00022">dbc_decoder.cpp:22</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00023">dbc_decoder.cpp:23</a></div></div>
<div class="ttc" id="aclassDbcParser_html"><div class="ttname"><a href="classDbcParser.html">DbcParser</a></div><div class="ttdoc">Minimal DBC parser.</div><div class="ttdef"><b>Definition</b> <a href="dbc__parser_8h_source.html#l00033">dbc_parser.h:33</a></div></div>
<div class="ttc" id="aclassDbcParser_html_a0e915ce79c2e3d4c95a5aaf2bf0409bc"><div class="ttname"><a href="classDbcParser.html#a0e915ce79c2e3d4c95a5aaf2bf0409bc">DbcParser::ParseFileWithDiagnostics</a></div><div class="ttdeci">DbcParseResult ParseFileWithDiagnostics(const std::string &amp;filePath) const</div><div class="ttdoc">Parse with warnings and a structured first error instead of throwing.</div><div class="ttdef"><b>Definition</b> <a href="dbc__parser_8cpp_source.html#l00044">dbc_parser.cpp:44</a></div></div>
<div class="ttc" id="aclassDbcParser_html_aef72826942c9095d653fafa435855e56"><div class="ttname"><a href="classDbcParser.html#aef72826942c9095d653fafa435855e56">DbcParser::ParseFile</a></div><div class="ttdeci">DbcDatabase ParseFile(const std::string &amp;filePath) const</div><div class="ttdoc">Parse DBC file.</div><div class="ttdef"><b>Definition</b> <a href="dbc__parser_8cpp_source.html#l00031">dbc_parser.cpp:31</a></div></div>
<div class="ttc" id="aclassDbcStatementDispatcher_html"><div class="ttname"><a href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00091">dbc_statement_handler.h:91</a></div></div>
<div class="ttc" id="aclassDbcStatementDispatcher_html_a495c2d5c7ebb8103b1987cdd87c142ed"><div class="ttname"><a href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">DbcStatementDispatcher::Dispatch</a></div><div class="ttdeci">bool Dispatch(const std::string &amp;line, DbcParseContext &amp;context) const</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00391">dbc_statement_handler.cpp:391</a></div></div>
<div class="ttc" id="aclassDbcStatementDispatcher_html_a495c2d5c7ebb8103b1987cdd87c142ed"><div class="ttname"><a href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">DbcStatementDispatcher::Dispatch</a></div><div class="ttdeci">bool Dispatch(const std::string &amp;line, DbcParseContext &amp;context) const</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00388">dbc_statement_handler.cpp:388</a></div></div>
<div class="ttc" id="aclassDbcStatementHandler_html"><div class="ttname"><a href="classDbcStatementHandler.html">DbcStatementHandler</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00044">dbc_statement_handler.h:44</a></div></div>
<div class="ttc" id="aclassDbcTreeBuilder_html"><div class="ttname"><a href="classDbcTreeBuilder.html">DbcTreeBuilder</a></div><div class="ttdoc">Builds a simple tree from parsed DBC database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__tree__builder_8h_source.html#l00023">dbc_tree_builder.h:23</a></div></div>
<div class="ttc" id="aclassDbcTreeBuilder_html_a7e57d067d831b14b383947fd125edd4b"><div class="ttname"><a href="classDbcTreeBuilder.html#a7e57d067d831b14b383947fd125edd4b">DbcTreeBuilder::Build</a></div><div class="ttdeci">std::unique_ptr&lt; TreeNode &gt; Build(const DbcDatabase &amp;database) const</div><div class="ttdoc">Build tree representation of parsed DBC data.</div><div class="ttdef"><b>Definition</b> <a href="dbc__tree__builder_8cpp_source.html#l00014">dbc_tree_builder.cpp:14</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html"><div class="ttname"><a href="classDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Immutable runtime snapshot. Copies share storage; reload replaces a snapshot. Owning lookup handles a...</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00087">decode_database.h:87</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_aa034c1510984a85f60ad6c0bd744d6e8"><div class="ttname"><a href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">DecodeDatabase::GetFrames</a></div><div class="ttdeci">const std::vector&lt; DecodeFrame &gt; &amp; GetFrames() const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00028">decode_database.cpp:28</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_aa034c1510984a85f60ad6c0bd744d6e8"><div class="ttname"><a href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">DecodeDatabase::GetFrames</a></div><div class="ttdeci">const std::vector&lt; DecodeFrame &gt; &amp; GetFrames() const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00105">decode_database.cpp:105</a></div></div>
<div class="ttc" id="adbc__decode__builder_8h_html"><div class="ttname"><a href="dbc__decode__builder_8h.html">dbc_decode_builder.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="adbc__decoder_8h_html"><div class="ttname"><a href="dbc__decoder_8h.html">dbc_decoder.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="adbc__parser_8h_html"><div class="ttname"><a href="dbc__parser_8h.html">dbc_parser.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>