CASE - Liquid testing - NL annual accounts - Cost of sales

Community case - liquid testing - NL cost of sales

Case outline

The purpose of this case is to give a practical example of how to code liquid tests in YAML. The example is based on the NL Annual accounts note Cost of Sales.

If you don’t have the rights to view the liquid code it may still be useful to go through this case and see for instance how units are defined.

This case may suit best if you are already familiar with some concepts of liquid testing as well as writing YAML tests.

Guidelines implementation

Coding best practices

  • When new to liquid testing, it makes sense to choose one actual template in a development environment to start from
  • Write down which test company you have used to copy from the debug mode
  • Include a numbering for the unit + test in each test name in the YAML
  • Add a one-line YAML comment before each test to explain briefly what this test is about
  • Make use of the collapse + expand and alias-autofill functionality of the text editor you are using, to keep overview
  • Refer to Liquid testing guidance for general tips and good practices on YAML syntax

Make use of debug mode

  • Each scenario that becomes a YAML test corresponds to a specific functional scenario. Create this scenario in input view you have selected. The relevant text properties, result tags and rollforward parameters can then be obtained via the debug mode
  • Note that besides input fields there is also other source data for a test, such as custom data and results from another template, and all data in the drops (e.g. accounts)

Start with an empty state

  • The empty state helps in step-by-step adding more tests and scenarios in order to create a YAML that adds value when used for liquid testing. The first unit defined is the “empty state” (see code in bottom section).

Identifying units and tests

The most difficult step in writing tests defining the ‘units’. The approach here is as follows:

  1. Try to designate functional elements of the template, which often reflect sections of code that can be isolated as units

  2. Define a unit as all code that relates to a functional element

  3. Obtain an overview of all source data of the template, and allocate the source data to the functional elements. It can help to enter a lot of data in the template and then to view the debug mode, but not without carefully inspecting the template code

  4. For each unit, determine a minimum of two scenarios based on:

    • Different possible data sources available for that unit, and
    • Altering the value of its data sources in the data section in the YAML
    • Define the scenarios such that the largest piece of code is covered with the minimum number of tests

The YAML for the example test suite can be found under the documentation section further below.

In the next couple of sections it is explained how each unit is determined, which source data and results are relevant to it, and how scenarios are determined on which the YAML tests are based.

(Unit 1) Account groups

1.1 Unit definition

NL cost of sales displays a list of account groups in a table which looks as follows. This section can be turned on-and-off with a boolean on top (Table). The first unit is defined as all code pertaining to this table.

1.2 Source data

This functional element uses a lot of different source data: settings from another template (general_settings), client input, previous year ledger data, and current year ledger data.

1.3 Result tags

The most relevant result tags for this unit are the RGS-code denominated results for cy and py for each account group, such as WKprGrp_cy_value. These are already all included in the empty state (but with 0-values).

1.4 Scenarios

Based on functional knowledge of the template and inspection of the code, important functional scenarios are:

  • Default state (test unit_1_account_group_test_1)

The only text property drafted is the rounding setting from another template (general_settings):

reconciliations:
    general_settings:
        custom:
            rounding.ofAcc: return_values_in_ones
  • Therefore: Different rounding settings: in unit_1_account_group_test_2 (only the rounding setting is changed to thousands, leaving other input data equal)
  • Overwriting values of the account groups in current year, previous year and both

This implies mocking some more text properties in unit_1_account_group_test_3:

reconciliations:
    general_settings:
        custom:
            rounding.ofAcc: return_values_in_thousands
            sorting.amount_or_rgs: rgs
   note_WKpr:
        custom:
            WKprGrp.drilldown: true
            choice.WKprMuo: Alternatieve omschrijving - Mutatie omzetvorderingen
            choice2.WKprMuo: Alternative description - Movements in sales receivables
            current_choice.WKprGrp: '24500.0'
            current_choice.WKprLeb: '-5000.0'
            prev_choice.WKprKuw: '3100.0'
            prev_choice.WKprLeb: '4500.0'
  • Different sortings of the table (unit_1_account_group_test_4, unit_1_account_group_test_5)

Please refer to the code block in the bottom section of the case to see all tests in full.

(Unit 2) Broken bookyears

2.1 Unit definition

In the current view, we see regular bookyears displayed in the headers (for a P&L note), but the template automatically turns these into ‘2017-2018’ for instance, if the bookyear would start halfway 2017.

Display of text such as headers is often not easily included in a unit, because it has no corresponding result tags and is usually tested as part of layout testing. However as an exception to this, I define unit number (2) as the broken bookyear logic. Based on experience this is a topic clients pay attention to and which also led to bugfixes in the past, therefore it is assigned to a unit for liquid testing purposes.
image (8)

2.2 Source data

Source data is only to be determined in the context section of the YAML, as some “irregular bookyear scenarios” need to be mocked. No actual input view of a template is used here (note that using debug mode of an actual template is helpful but liquid tests can also be written completely without it).

2.3 Result tags

This unit will require creation of a new result tag in the template. I decide to add it because there won’t be another way to test this isolated code (part main):

{% comment %}results for liquid testing{% endcomment %}
{% result 'current_year_to_display' current_year_to_display %}
{% result 'prev_year_to_display' prev_year_to_display %}

2.4 Scenarios

Relevant scenarios: one for each ‘type’ of irregular bookyear, leaving all other data more or less equal:

  • Broken but same length (e.g. 1/7 to 30/6). Recall from the documentation that under the data section, there is the YAML option to add special_book_years as follows:
data:
    special_book_years:
      2016-07-01: 2017-06-30
      2017-07-01: 2018-06-30
  • Shortened (using the same YAML functionality)
  • Prolonged

(Unit 3) Export language scenarios

3.1 Unit definition

In the NL annual accounts, clients can set up a template in two languages simultaneously. This is mostly visible at the left side of the template where the descriptions are shown. This feature requires a lot of specific code throughout the template. It is not a specific table or section of the template from a user perspective, but it is a functional element.

3.2 Source data

The double/single language option and relevant export language settings are all found in another template, general_settings. Other relevant source data are the multi-language input fields visible in that template.

3.3 Result tags

The relevant result tags are however to be found only in part nl_aa_notes_p1 and nl_aa_notes_main.

3.4 Scenarios

Test scenarios are the functional export language scenarios from the general settings:

  • Two-language preparation (‘double table’), with English export
  • Two-language preparation, with Dutch export
  • One-language preparation (Dutch export)
reconciliations:
    general_settings:
        custom: 
            rounding.ofAcc: 'return_values_in_ones'
        results:
            grondslage_table: 'double_table'
            grondslagen_export: 'Eng'

As you can see in the YAML text on the bottom, also some text property is to be mocked to trigger the translation logic, e.g. as seen in unit_3_language_test_1:

namespace_WKprGrp.namespace_WKprGrp_1:
   additional_text_provided_nl: 'Liquid testing NL'

(Unit 4) Show previous year

4.1 Unit definition

This unit relates to logic on whether or not the option to show the previous year column is available and the actual effect of enabling or disabling this option.

4.2 Source data

The only source data for this unit is the boolean button value and the context data, which determines whether or not the template is viewed in the first year in SF.

4.3 Result tags

The results (py) for each account group, which are dynamically named after the account code for that group. This is because the py results will not be sent in case previous year view is not activated.

4.4 Scenarios

Scenarios included:

  • unit_4_show_prev_year_test_1: only cy mocked in data section
  • unit_4_show_prev_year_test_2: cy and py mocked in data section; boolean blank (note that the default is true):
note_WKpr:
    custom:
        check.prev_year: null
  • unit_4_show_prev_year_test_3: cy and py mocked, boolean set to false

Test suite structure

  • The first test that is mocked is the empty state. Then for each unit a number of scenarios is determined so the total number of YAML tests equals units * scenarios + 1
  • There is no “success vs. fail-path” logic applied to all units, this is applicable only for unit no. 5 in which reconciled logic is applied

Make use of anchors and aliases

  • Definition of anchors should only be done in the first test of each scenario
  • Definition of anchors should be limited to the first test of the entire suite as much as possible (not counting the empty state)

Results

  • New results are created in exceptional cases, i.e. when a certain piece of code is deemed important but does not affect any result tags. In the example above this is the case for unit 2 (broken bookyears) for which result tags were added which include the column headers displayed. A rule is that the results should be useful somehow for a client (e.g. in an insights query)

Documentation

See below for an example of how the set of liquid tests described above is written in YAML.

YAML code:

empty_state:
  context:
    locale: en
    period: 2018-12-31
  data:
    company:
      name: JAF Bende Holding B.V. (jaarrekening test)
    periods:
      2018-12-31:
        reconciliations:
          general_settings: {}
          note_WKpr: {}
  expectation:
    reconciled: true
    results: &zero_result_bp
      WKprAkl_cy_value: 0.0
      WKprAkl_py_value: 0.0
      WKprAkv_cy_value: 0.0
      WKprAkv_py_value: 0.0
      WKprBtk_cy_value: 0.0
      WKprBtk_py_value: 0.0
      WKprGrp_cy_value: 0.0
      WKprGrp_py_value: 0.0
      WKprIna_cy_value: 0.0
      WKprIna_py_value: 0.0
      WKprInh_cy_value: 0.0
      WKprInh_py_value: 0.0
      WKprInp_cy_value: 0.0
      WKprInp_py_value: 0.0
      WKprKit_cy_value: 0.0
      WKprKit_py_value: 0.0
      WKprKra_cy_value: 0.0
      WKprKra_py_value: 0.0
      WKprKuw_cy_value: 0.0
      WKprKuw_py_value: 0.0
      WKprKvg_cy_value: 0.0
      WKprKvg_py_value: 0.0
      WKprKvp_cy_value: 0.0
      WKprKvp_py_value: 0.0
      WKprLeb_cy_value: 0.0
      WKprLeb_py_value: 0.0
      WKprMuo_cy_value: 0.0
      WKprMuo_py_value: 0.0
      WKprPrd_cy_value: 0.0
      WKprPrd_py_value: 0.0
      WKprPrg_cy_value: 0.0
      WKprPrg_py_value: 0.0
      WKprVom_cy_value: 0.0
      WKprVom_py_value: 0.0
      WKprOni_cy_value: 0.0
      WKprOni_py_value: 0.0
      WKprTvl_cy_value: 0.0
      WKprTvl_py_value: 0.0
      array: &rgs_codes_array [WKprKvg, WKprKvp, WKprKuw, WKprAkl, WKprIna, WKprAkv, WKprKra, WKprInh, WKprInp, WKprLeb, WKprBtk, WKprKit, WKprMuo, WKprVom, WKprPrg, WKprPrd, WKprGrp, WKprOni, WKprTvl]
      other_cy_value: 0.0
      other_py_value: 0.0
      current_year_to_display: '2018'
      prev_year_to_display: '2017'
    rollforward: &zero_rollforward_bp
      current_choice.WKprAkl: null
      current_choice.WKprAkv: null
      current_choice.WKprBtk: null
      current_choice.WKprGrp: null
      current_choice.WKprIna: null
      current_choice.WKprInh: null
      current_choice.WKprInp: null
      current_choice.WKprKit: null
      current_choice.WKprKra: null
      current_choice.WKprKuw: null
      current_choice.WKprKvg: null
      current_choice.WKprKvp: null
      current_choice.WKprLeb: null
      current_choice.WKprMuo: null
      current_choice.WKprPrd: null
      current_choice.WKprPrg: null
      current_choice.WKprVom: null
      current_choice.WKprOni: null
      current_choice.WKprTvl: null
      prev_choice.WKprAkl: null
      prev_choice.WKprAkv: null
      prev_choice.WKprBtk: null
      prev_choice.WKprGrp: null
      prev_choice.WKprIna: null
      prev_choice.WKprInh: null
      prev_choice.WKprInp: null
      prev_choice.WKprKit: null
      prev_choice.WKprKra: null
      prev_choice.WKprKuw: null
      prev_choice.WKprKvg: null
      prev_choice.WKprKvp: null
      prev_choice.WKprLeb: null
      prev_choice.WKprMuo: null
      prev_choice.WKprPrd: null
      prev_choice.WKprPrg: null
      prev_choice.WKprVom: null
      prev_choice.WKprOni: null
      prev_choice.WKprTvl: null

# (1) account group unit is included in nl_aa_vars and nl_aa_notes_p1 58-59 and loosely matches the logic behind the 'big table'
unit_1_account_group_test_1:
  context:
    locale: en
    period: 2018-12-31
  data:
    periods:
      2017-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -66943.95
          WKprAkl.000:
            id: 80000000
            value: 1000
      2018-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -20500
          WKprAkl.000:
            id: 80000000
            value: 2000
        reconciliations:
          general_settings: {}
  expectation:
    reconciled: true
    results:
      <<: *zero_result_bp
      WKprAkl_cy_value: 2000
      WKprAkl_py_value: 1000
      WKprGrp_cy_value: -20500.0
      WKprGrp_py_value: -66944.0
      array: *rgs_codes_array
      other_cy_value: 0.0
      other_py_value: 0.0
      current_year_to_display: '2018'
      prev_year_to_display: '2017'
    rollforward:
      <<: *zero_rollforward_bp
      
unit_1_account_group_test_2:
  context:
    locale: en
    period: 2018-12-31
  data:
    periods:
      2017-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -66943.95
          WKprAkl.000:
            id: 80000000
            value: 1000
      2018-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -20500
          WKprAkl.000:
            id: 80000000
            value: 2000
        reconciliations:
          general_settings:
            custom:
              rounding.ofAcc: return_values_in_thousands
  expectation:
    reconciled: true
    results:
      <<: *zero_result_bp
      WKprAkl_cy_value: 2
      WKprAkl_py_value: 1
      WKprGrp_cy_value: -21
      WKprGrp_py_value: -67
      array: *rgs_codes_array
      other_cy_value: 0.0
      other_py_value: 0.0
      current_year_to_display: '2018'
      prev_year_to_display: '2017'
    rollforward:
      <<: *zero_rollforward_bp

unit_1_account_group_test_3:
  context:
    locale: en
    period: 2018-12-31
  data:
    periods:
      2017-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -66943.95
          WKprAkl.000:
            id: 80000000
            value: 1000
      2018-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -20500
          WKprAkl.000:
            id: 80000000
            value: 2000
        reconciliations:
          general_settings:
            custom:
              rounding.ofAcc: return_values_in_ones
          note_WKpr:
            custom:    
              WKprGrp.drilldown: true
              choice.WKprMuo: Alternatieve omschrijving - Mutatie omzetvorderingen
              choice2.WKprMuo: Alternative description - Movements in sales receivables
              current_choice.WKprGrp: '24500.0'
              current_choice.WKprLeb: '-5000.0'
              prev_choice.WKprKuw: '3100.0'
              prev_choice.WKprLeb: '4500.0'
  expectation:
    reconciled: false
    results:
      <<: *zero_result_bp
      namespace_WKprGrp: ""
      cy_spec_sub_value_WKprGrpGr1: -20500
      py_spec_sub_value_WKprGrpGr1: -66944.0
      WKprAkl_cy_value: 2000
      WKprAkl_py_value: 1000
      WKprGrp_cy_value: 24500.0
      WKprGrp_py_value: -66944.0
      WKprKuw_py_value: 3100.0
      WKprLeb_cy_value: -5000.0
      WKprLeb_py_value: 4500.0
      array: *rgs_codes_array
      other_cy_value: -40000.0
      other_py_value: -7600.0
      current_year_to_display: '2018'
      prev_year_to_display: '2017'
    rollforward:
      <<: *zero_rollforward_bp
      current_choice.local_current_85315173: null
      prev_choice.local_prev_85315173: null

unit_1_account_group_test_4:
  context:
    locale: en
    period: 2018-12-31
  data:
    periods:
      2017-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -66943.95
          WKprAkl.000:
            id: 80000000
            value: 1000
      2018-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -20500
          WKprAkl.000:
            id: 80000000
            value: 2000
        reconciliations:
          general_settings:
            custom:
              rounding.ofAcc: return_values_in_thousands
              sorting.amount_or_rgs: rgs
          note_WKpr:
            custom:
              WKprGrp.drilldown: true
              choice.WKprMuo: Alternatieve omschrijving - Mutatie omzetvorderingen
              choice2.WKprMuo: Alternative description - Movements in sales receivables
              current_choice.WKprGrp: '24500.0'
              current_choice.WKprLeb: '-5000.0'
              prev_choice.WKprKuw: '3100.0'
              prev_choice.WKprLeb: '4500.0'
  expectation:
    reconciled: false
    results:
      <<: *zero_result_bp
      namespace_WKprGrp: ""
      cy_spec_sub_value_WKprGrpGr1: -21
      py_spec_sub_value_WKprGrpGr1: -67
      WKprAkl_cy_value: 2
      WKprAkl_py_value: 1
      WKprGrp_cy_value: 24500
      WKprGrp_py_value: -67
      WKprKuw_py_value: 3100
      WKprLeb_cy_value: -5000.0
      WKprLeb_py_value: 4500
      other_cy_value: -19521
      other_py_value: -7600
      array: *rgs_codes_array
      current_year_to_display: '2018'
      prev_year_to_display: '2017'
    rollforward:
      <<: *zero_rollforward_bp
      current_choice.local_current_85315173: null
      prev_choice.local_prev_85315173: null

unit_1_account_group_test_5:
  context:
    locale: en
    period: 2018-12-31
  data:
    periods:
      2017-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -66943.95
          WKprAkl.000:
            id: 80000000
            value: 1000
      2018-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -20500
          WKprAkl.000:
            id: 80000000
            value: 2000
        reconciliations:
          general_settings:
            custom:
              rounding.ofAcc: return_values_in_thousands
              sorting.amount_or_rgs: amount
          note_WKpr:
            custom:
              WKprGrp.drilldown: true
              choice.WKprMuo: Alternatieve omschrijving - Mutatie omzetvorderingen
              choice2.WKprMuo: Alternative description - Movements in sales receivables
              current_choice.WKprGrp: '24500.0'
              current_choice.WKprLeb: '-5000.0'
              prev_choice.WKprKuw: '3100.0'
              prev_choice.WKprLeb: '4500.0'
  expectation:
    reconciled: false
    results:
      <<: *zero_result_bp
      namespace_WKprGrp: ""
      cy_spec_sub_value_WKprGrpGr1: -21
      py_spec_sub_value_WKprGrpGr1: -67
      WKprAkl_cy_value: 2
      WKprAkl_py_value: 1
      WKprGrp_cy_value: 24500
      WKprGrp_py_value: -67
      WKprKuw_py_value: 3100
      WKprLeb_cy_value: -5000.0
      WKprLeb_py_value: 4500
      other_cy_value: -19521
      other_py_value: -7600
      array: *rgs_codes_array
      current_year_to_display: '2018'
      prev_year_to_display: '2017'
    rollforward:
      <<: *zero_rollforward_bp
      current_choice.local_current_85315173: null
      prev_choice.local_prev_85315173: null


# (2) broken bookyear unit is found in nl_aa_vars 114-158
# First test: 'regular' broken year
unit_2_broken_bookyears_test_1:
  context:
    locale: en
    period: 2018-06-30
  data:
    special_book_years:
      2016-07-01: 2017-06-30
      2017-07-01: 2018-06-30
    periods: &period_settings_bp
      2017-06-30:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -66943.95
      2018-06-30:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -20500
        reconciliations:
          general_settings:
            custom:
              rounding.ofAcc: return_values_in_thousands
  expectation:
    reconciled: true
    results:
      <<: *zero_result_bp
      WKprGrp_cy_value: -21
      WKprGrp_py_value: -67
      array: *rgs_codes_array
      other_cy_value: 0.0
      other_py_value: 0.0
      current_year_to_display: '2017-2018'
      prev_year_to_display: '2016-2017'
    rollforward:
      <<: *zero_rollforward_bp

# Second test: shortened broken years
unit_2_broken_bookyears_test_2:
  context:
    locale: en
    period: 2018-06-30
  data:
    special_book_years:
      2016-10-01: 2017-06-30
      2017-07-01: 2018-12-31
    periods:
      <<: *period_settings_bp
  expectation:
    reconciled: true
    results:
      <<: *zero_result_bp
      WKprGrp_cy_value: -21
      WKprGrp_py_value: -67
      array: *rgs_codes_array
      other_cy_value: 0.0
      other_py_value: 0.0
      current_year_to_display: '2017-2018'
      prev_year_to_display: '2016-2017'
    rollforward:
      <<: *zero_rollforward_bp

# Third test: prolonged broken years
unit_2_broken_bookyears_test_3:
  context:
    locale: en
    period: 2018-06-30
  data:
    special_book_years:
      2016-01-01: 2017-06-30
      2017-07-01: 2019-12-31
    periods:
      <<: *period_settings_bp
  expectation:
    reconciled: true
    results:
      <<: *zero_result_bp
      WKprGrp_cy_value: -21
      WKprGrp_py_value: -67
      array: *rgs_codes_array
      other_cy_value: 0.0
      other_py_value: 0.0
      current_year_to_display: '2017-2019'
      prev_year_to_display: '2016-2017'
    rollforward:
      <<: *zero_rollforward_bp

# (3) export language scenarios unit is located in nl_aa_notes_p1
unit_3_language_test_1:
  context:
    locale: en
    period: 2018-12-31
  data:
    periods:
      2017-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -66943.95
      2018-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -20500
        reconciliations:
          general_settings:
            custom: 
              rounding.ofAcc: 'return_values_in_ones'
            results:
              grondslage_table: 'double_table'
              grondslagen_export: 'Eng'
          note_WKpr:
            custom:
              WKprGrp.drilldown: true
              namespace_WKprGrp.namespace_WKprGrp_1:
                additional_text_provided_nl: 'Liquid testing NL'
                additional_text_provided_en: 'Liquid testing EN'
              namespace_WKprGrp.namespace_WKprGrp_2:
                additional_text_provided_nl: 'Liquid testing NL (2)'
                additional_text_provided_en: 'Liquid testing EN (2)'
              toeli.others: 'Alternatieve omschrijving overige'
              toeli2.others: 'Alternative description others'
  expectation:
    reconciled: true
    results:
      <<: *zero_result_bp
      WKprGrp_cy_value: -20500.0
      WKprGrp_py_value: -66944.0
      array: *rgs_codes_array
      other_cy_value: 0.0
      other_py_value: 0.0
      current_year_to_display: '2018'
      prev_year_to_display: '2017'
      namespace_WKprGrp: "Liquid testing EN Liquid testing EN (2) "
      cy_spec_sub_value_WKprGrpGr1: -20500.0
      py_spec_sub_value_WKprGrpGr1: -66944.0
    rollforward:
      <<: *zero_rollforward_bp
      current_choice.local_current_85315173: null
      prev_choice.local_prev_85315173: null

unit_3_language_test_2:
  context:
    locale: en
    period: 2018-12-31
  data:
    periods:
      2017-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -66943.95
      2018-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -20500
        reconciliations:
          general_settings:
            custom: 
              rounding.ofAcc: 'return_values_in_ones'
            results:
              grondslage_table: 'double_table'
              grondslagen_export: 'Ned'
          note_WKpr:
            custom:
              WKprGrp.drilldown: true
              namespace_WKprGrp.namespace_WKprGrp_1:
                additional_text_provided_nl: 'Liquid testing NL'
                additional_text_provided_en: 'Liquid testing EN'
              namespace_WKprGrp.namespace_WKprGrp_2:
                additional_text_provided_nl: 'Liquid testing NL (2)'
                additional_text_provided_en: 'Liquid testing EN (2)'
              toeli.others: 'Alternatieve omschrijving overige'
              toeli2.others: 'Alternative description others'
  expectation:
    reconciled: true
    results:
      <<: *zero_result_bp
      WKprGrp_cy_value: -20500.0
      WKprGrp_py_value: -66944.0
      array: *rgs_codes_array
      other_cy_value: 0.0
      other_py_value: 0.0
      current_year_to_display: '2018'
      prev_year_to_display: '2017'
      namespace_WKprGrp: "Liquid testing NL Liquid testing NL (2) "
      cy_spec_sub_value_WKprGrpGr1: -20500.0
      py_spec_sub_value_WKprGrpGr1: -66944.0
    rollforward:
      <<: *zero_rollforward_bp
      current_choice.local_current_85315173: null
      prev_choice.local_prev_85315173: null

unit_3_language_test_3:
  context:
    locale: en
    period: 2020-12-31
  data:
    periods:
      2019-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: 5000
      2020-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: 2500
        reconciliations:
          general_settings:
            custom: 
              rounding.ofAcc: 'return_values_in_ones'
            results:
              grondslage_table: 'single_table'
          note_WKpr:
            custom:
              WKprGrp.drilldown: true
              namespace_WKprGrp.namespace_WKprGrp_1:
                additional_text_provided_nl: 'Liquid testing NL'
                additional_text_provided_en: 'Liquid testing EN'
              namespace_WKprGrp.namespace_WKprGrp_2:
                additional_text_provided_nl: 'Liquid testing NL (2)'
                additional_text_provided_en: 'Liquid testing EN (2)'
              toeli.others: 'Alternatieve omschrijving overige'
  expectation:
    reconciled: true
    results:
      <<: *zero_result_bp
      WKprGrp_cy_value: 2500
      WKprGrp_py_value: 5000
      array: *rgs_codes_array
      other_cy_value: 0.0
      other_py_value: 0.0
      current_year_to_display: '2020'
      prev_year_to_display: '2019'
      namespace_WKprGrp: "Liquid testing NL Liquid testing NL (2) "
      cy_spec_sub_value_WKprGrpGr1: 2500
      py_spec_sub_value_WKprGrpGr1: 5000
    rollforward:
      <<: *zero_rollforward_bp
      current_choice.local_current_85315173: null
      prev_choice.local_prev_85315173: null

# (4) Show or hide previous year column
unit_4_show_prev_year_test_1:
  context:
    locale: en
    period: 2019-12-31
  data:
    periods:
      2019-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -20500
        reconciliations:
          general_settings:
            custom: 
              rounding.ofAcc: 'return_values_in_ones'
            results:
              grondslage_table: 'double_table'
              grondslagen_export: 'Eng'
  expectation:
    reconciled: true
    results:
      <<: *zero_result_bp
      WKprGrp_cy_value: -20500.0
      array: *rgs_codes_array
      other_cy_value: 0.0
      current_year_to_display: '2019'
      prev_year_to_display: '2018'
    rollforward:
      <<: *zero_rollforward_bp

unit_4_show_prev_year_test_2:
  context:
    locale: en
    period: 2019-12-31
  data:
    periods:
      2018-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -66943.95
      2019-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -20500
        reconciliations:
          general_settings:
            custom: 
              rounding.ofAcc: 'return_values_in_ones'
            results:
              grondslage_table: 'double_table'
              grondslagen_export: 'Eng'
          note_WKpr:
            custom:
              check.prev_year: null
  expectation:
    reconciled: true
    results:
      <<: *zero_result_bp
      WKprGrp_cy_value: -20500.0
      WKprGrp_py_value: -66944.0
      array: *rgs_codes_array
      other_cy_value: 0.0
      other_py_value: 0.0
      current_year_to_display: '2019'
      prev_year_to_display: '2018'
    rollforward:
      <<: *zero_rollforward_bp

unit_4_show_prev_year_test_3:
  context:
    locale: en
    period: 2019-12-31
  data:
    periods:
      2018-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -66943.95
      2019-12-31:
        accounts:
          WKprGrpGr1.000:
            id: 85315173
            value: -20500
        reconciliations:
          general_settings:
            custom: 
              rounding.ofAcc: 'return_values_in_ones'
            results:
              grondslage_table: 'double_table'
              grondslagen_export: 'Eng'
          note_WKpr:
            custom:
              check.prev_year: false
  expectation:
    reconciled: true
    results:
      <<: *zero_result_bp
      WKprGrp_cy_value: -20500.0
      WKprGrp_py_value: -66944.0
      array: *rgs_codes_array
      other_cy_value: 0.0
      current_year_to_display: '2019'
      prev_year_to_display: '2018'
    rollforward:
      <<: *zero_rollforward_bp

*Unit 5 is omitted because of the community character limit*