Skip to content

Commit dab2163

Browse files
Merge pull request #153 from martinfantini/optional_decimal
Optional decimal
2 parents de3f0c5 + dc4d1dd commit dab2163

7 files changed

+86
-0
lines changed

src/mfast/coder/encoder/encoder_field_operator.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,7 @@ class delta_operator : public encoder_field_operator,
548548
cref.exponent() - bv.of_decimal.exponent_;
549549
delta_storage.of_decimal.mantissa_ =
550550
cref.mantissa() - bv.of_decimal.mantissa_;
551+
delta_storage.of_decimal.present_ = cref.present();
551552

552553
decimal_cref delta(&delta_storage, cref.instruction());
553554
stream << delta;

tests/encoder_decoder_test.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,3 +280,19 @@ TEST_CASE("sequence optional with constant length encoder/decoder","[optional_se
280280
REQUIRE(test_case.decoding("\xF0\x87\x82\xa0\x82\x82",test_7.cref(),true));
281281
}
282282
}
283+
284+
TEST_CASE("decimal optional encoder/decoder","[decimal_optional_encoder_decoder]")
285+
{
286+
fast_test_coding_case<simple12::templates_description> test_case;
287+
288+
SECTION("encode decimal value")
289+
{
290+
simple12::Test_8 test_8;
291+
simple12::Test_8_mref test_8_mref = test_8.mref();
292+
test_8_mref.set_field_8_1().as(15, 1);
293+
test_8_mref.set_field_8_2().as(20);
294+
295+
REQUIRE(test_case.encoding(test_8.cref(),"\xE0\x88\x81\x8F\x94",true));
296+
REQUIRE(test_case.decoding("\xE0\x88\x81\x8F\x94",test_8.cref(),true));
297+
}
298+
}

tests/encoder_decoder_test_v2.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,3 +281,19 @@ TEST_CASE("sequence optional with constant length encoder_v2/decoder_v2","[optio
281281
REQUIRE(test_case.decoding("\xF0\x87\x82\xa0\x82\x82",test_7.cref(),true));
282282
}
283283
}
284+
285+
TEST_CASE("decimal optional encoder_v2/decoder_v2","[decimal_optional_encoder_v2/decoder_v2]")
286+
{
287+
fast_test_coding_case_v2<simple12::templates_description> test_case;
288+
289+
SECTION("encode decimal value")
290+
{
291+
simple12::Test_8 test_8;
292+
simple12::Test_8_mref test_8_mref = test_8.mref();
293+
test_8_mref.set_field_8_1().as(15, 1);
294+
test_8_mref.set_field_8_2().as(20);
295+
296+
REQUIRE(test_case.encoding(test_8.cref(),"\xE0\x88\x81\x8F\x94",true));
297+
REQUIRE(test_case.decoding("\xE0\x88\x81\x8F\x94",test_8.cref(),true));
298+
}
299+
}

tests/sequence_encoder_decoder.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,3 +275,24 @@ TEST_CASE("sequence with optional group encoder/decoder","[sequence_optional_gro
275275
REQUIRE(test_case.decoding("\xC0\x87\x81\xE0\xB2\x94",test_7.cref(),true));
276276
}
277277
}
278+
279+
TEST_CASE("sequence with optional decimal encoder/decoder", "[sequence_with_optional_decimal_encoder_decoder]")
280+
{
281+
fast_test_coding_case<simple14::templates_description> test_case;
282+
283+
SECTION("decimal present")
284+
{
285+
simple14::Test_8 test_8;
286+
simple14::Test_8_mref test_8_mref = test_8.mref();
287+
288+
auto sequence_8_mref = test_8_mref.set_sequence_8();
289+
sequence_8_mref.resize(1);
290+
291+
auto element_sequence = sequence_8_mref.front();
292+
element_sequence.set_field_8_2().as(50);
293+
element_sequence.set_field_8_3().as(10, 1);
294+
295+
REQUIRE(test_case.encoding(test_8.cref(),"\xC0\x88\x81\xC0\xB2\x82\x8A",true));
296+
REQUIRE(test_case.decoding("\xC0\x88\x81\xC0\xB2\x82\x8A",test_8.cref(),true));
297+
}
298+
}

tests/sequence_encoder_decoder_v2.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,3 +277,24 @@ TEST_CASE("sequence with optional group encoder_V2/decoder_v2","[sequence_option
277277
REQUIRE(test_case.decoding("\xC0\x87\x81\xE0\xB2\x94",test_7.cref(),true));
278278
}
279279
}
280+
281+
TEST_CASE("sequence with optional decimal encoder_V2/decoder_v2", "[sequence_with_optional_decimal_encoder_v2_decoder_v2]")
282+
{
283+
fast_test_coding_case_v2<simple14::templates_description> test_case;
284+
285+
SECTION("decimal present")
286+
{
287+
simple14::Test_8 test_8;
288+
simple14::Test_8_mref test_8_mref = test_8.mref();
289+
290+
auto sequence_8_mref = test_8_mref.set_sequence_8();
291+
sequence_8_mref.resize(1);
292+
293+
auto element_sequence = sequence_8_mref.front();
294+
element_sequence.set_field_8_2().as(50);
295+
element_sequence.set_field_8_3().as(10, 1);
296+
297+
REQUIRE(test_case.encoding(test_8.cref(),"\xC0\x88\x81\xC0\xB2\x82\x8A",true));
298+
REQUIRE(test_case.decoding("\xC0\x88\x81\xC0\xB2\x82\x8A",test_8.cref(),true));
299+
}
300+
}

tests/simple12.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,8 @@
6565
</uInt32>
6666
</sequence>
6767
</template>
68+
<template name="Test_8" id="8">
69+
<decimal name="field_8_1" id="81"><delta/></decimal>
70+
<uInt32 name="field_8_2" id="82"><copy/></uInt32>
71+
</template>
6872
</templates>

tests/simple14.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,11 @@
6363
</group>
6464
</sequence>
6565
</template>
66+
<template name="Test_8" id="8">
67+
<sequence name="sequence_8">
68+
<length name="field_8_1" id="81"></length>
69+
<uInt32 name="field_8_2" id="82"><copy/></uInt32>
70+
<decimal name="field_8_3" id="84" presence="optional"><delta/></decimal>
71+
</sequence>
72+
</template>
6673
</templates>

0 commit comments

Comments
 (0)