Description
This test ensures the correctness of the Connect agent PandasExcelReader. Contributor: Clemens Westphal, March 2022
Small Model of Type : GAMS
Category : GAMS Test library
Main file : capdxlsr.gms
$title 'Test Connect agent PandasExcelReader' (CAPDXLSR,SEQ=898)
$ontext
This test ensures the correctness of the Connect agent PandasExcelReader.
Contributor: Clemens Westphal, March 2022
$offtext
* On the major platforms (Windows, Linux, Mac), GMSPYTHONLIB gets automatically set
* to use the internal Python installation in sysdir/GMSPython.
$if not setEnv GMSPYTHONLIB $abort.noError Embedded code Python not ready to be used
$log --- Using Python library %sysEnv.GMSPYTHONLIB%
$log read a scalar and use valueSubstitutions
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p0
range: scalar!B3
rowDimension: 0
columnDimension: 0
valueSubstitutions: {5: 6}
- PythonCode:
code: |
expected = 6
data = connect.db['p0'].first_record().value
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 2-dim parameter from a full range (sparse)
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p2
range: multi!B2:G6
rowDimension: 1
columnDimension: 1
- PythonCode:
code: |
expected = [
('i1', 'j1', 1.),
('i1', 'j2', 2.),
('i1', 'j3', 3.),
('i1', 'j4', 4.),
('i1', 'j5', 5.),
('i2', 'j1', 6.),
('i3', 'j2', 12.),
('i4', 'j1', 16.),
('i4', 'j3', 18.),
('i4', 'j5', 20.)
]
data = [(*r.keys, r.value) for r in connect.db['p2']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 2-dim parameter using NW corner with multiple symbols in spreadsheet
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p2
range: multi!B2
rowDimension: 1
columnDimension: 1
drop: 'Unnamed'
- PythonCode:
code: |
expected = [
('i1', 'j1', 1.),
('i1', 'j2', 2.),
('i1', 'j3', 3.),
('i1', 'j4', 4.),
('i1', 'j5', 5.),
('i1', 'j6', 21.),
('i1', 'j8', 23.),
('i2', 'j1', 6.),
('i2', 'j9', 29.),
('i3', 'j2', 12.),
('i3', 'j7', 32.),
('i3', 'j10', 35.),
('i4', 'j1', 16.),
('i4', 'j3', 18.),
('i4', 'j5', 20.),
('i4', 'j6', 36.),
('i4', 'j8', 38.)
]
data = [(*r.keys, r.value) for r in connect.db['p2']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 3-dim parameter from a full range and test case insensitivity of sheet names
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p3
range: MuLtI2!B2:I6
rowDimension: 1
columnDimension: 2
- PythonCode:
code: |
expected = [
('i1', 'j1', 'k1', 1.),
('i1', 'j1', 'k2', 2.),
('i1', 'j2', 'k1', 3.),
('i1', 'j3', 'k2', 5.),
('i1', 'j4', 'k1', 6.),
('i1', 'j5', 'k2', 7.),
('i2', 'j1', 'k1', 8.),
('i2', 'j4', 'k1', 13.)
]
data = [(*r.keys, r.value) for r in connect.db['p3']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 3-dim parameter using NW corner with multiple symbols in spreadsheet
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p3
range: multi2!B2
rowDimension: 1
columnDimension: 2
drop: '\.'
- PythonCode:
code: |
expected = [
('i1', 'j1', 'k1', 1.),
('i1', 'j1', 'k2', 2.),
('i1', 'j2', 'k1', 3.),
('i1', 'j3', 'k2', 5.),
('i1', 'j4', 'k1', 6.),
('i1', 'j5', 'k2', 7.),
('i1', 'j6', 'k1', 15.),
('i1', 'j6', 'k2', 16.),
('i1', 'j6', 'k3', 17.),
('i2', 'j1', 'k1', 8.),
('i2', 'j4', 'k1', 13.),
('i2', 'j6', 'k1', 18.)
]
data = [(*r.keys, r.value) for r in connect.db['p3']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 2-dim set from a full range
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: s2
range: multi3!A2:E5
rowDimension: 0
columnDimension: 2
type: set
- PythonCode:
code: |
expected = [
('i1', 'j1', 'text 1'),
('i2', 'j1', 'text 2')
]
data = [(*r.keys, r.text) for r in connect.db['s2']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 2-dim set using NW corner with multiple symbols in spreadsheet
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: s2
range: multi3!A2
rowDimension: 0
columnDimension: 2
type: set
drop: '\.'
- PythonCode:
code: |
expected = [
('i1', 'j1', 'text 1'),
('i2', 'j1', 'text 2'),
('i3', 'j1', 'text 3')
]
data = [(*r.keys, r.text) for r in connect.db['s2']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 3-dim parameter without data from a full range
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p3
range: empty!A1:E5
rowDimension: 1
columnDimension: 2
- PythonCode:
code: |
expected = []
data = [(*r.keys, r.text) for r in connect.db['p3']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 3-dim parameter without data using NW corner
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p3
range: empty!A1
rowDimension: 1
columnDimension: 2
- PythonCode:
code: |
expected = []
data = [(*r.keys, r.text) for r in connect.db['p3']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 3-dim set without data from a full (partial) range
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
type: set
rowDimension: 1
columnDimension: 2
symbols:
- name: s3
range: empty!A1:D4
- PythonCode:
code: |
expected = []
data = [(*r.keys, r.text) for r in connect.db['s3']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 2-dim parameter from a full range using valueSubstitutions
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p2
range: multi!B2:G6
rowDimension: 1
columnDimension: 1
valueSubstitutions: { .nan: eps }
- PythonCode:
code: |
from gams import GMS_SV_EPS
expected = [
('i1', 'j1', 1.),
('i1', 'j2', 2.),
('i1', 'j3', 3.),
('i1', 'j4', 4.),
('i1', 'j5', 5.),
('i2', 'j1', 6.),
('i2', 'j2', -0.0 ),
('i2', 'j3', -0.0 ),
('i2', 'j4', -0.0 ),
('i2', 'j5', -0.0 ),
('i3', 'j1', -0.0 ),
('i3', 'j2', 12.),
('i3', 'j3', -0.0 ),
('i3', 'j4', -0.0 ),
('i3', 'j5', -0.0 ),
('i4', 'j1', 16.),
('i4', 'j2', -0.0 ),
('i4', 'j3', 18.),
('i4', 'j4', -0.0 ),
('i4', 'j5', 20.)
]
data = [(*r.keys, r.value) for r in connect.db['p2']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 2-dim parameter with integer labels
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p2
range: int_labels!A1
- PythonCode:
code: |
expected = [
('1', '5', 1.),
('1', '6', 2.),
('2', '6', 5.),
('2', '7', 6.),
('3', '6', 8.),
('3', '7', 9.),
]
data = [(*r.keys, r.value) for r in connect.db['p2']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 2-dim set using excelReadArgs
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: s2
range: wrong_sheet!A2:E5
rowDimension: 0
columnDimension: 2
type: set
readExcelArguments: { sheet_name: multi3 }
- PythonCode:
code: |
expected = [
('i1', 'j1', 'text 1'),
('i2', 'j1', 'text 2')
]
data = [(*r.keys, r.text) for r in connect.db['s2']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 3-dim parameter with rdim=dim
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p3
range: rdim_only!B2
rowDimension: 3
columnDimension: 0
- PythonCode:
code: |
expected = [
('i1', 'j1', 'k1', 0.1),
('i1', 'j1', 'k3', 0.3),
('i1', 'j2', 'k3', 0.6),
('i2', 'j1', 'k2', 0.8),
('i2', 'j2', 'k3', 1.3)
]
data = [(*r.keys, r.value) for r in connect.db['p3']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 3-dim parameter from a full range with rdim=dim
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p3
range: rdim_only!B2:E5
rowDimension: 3
columnDimension: 0
- PythonCode:
code: |
expected = [
('i1', 'j1', 'k1', 0.1),
('i1', 'j1', 'k3', 0.3)
]
data = [(*r.keys, r.value) for r in connect.db['p3']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 3-dim parameter with cdim=dim
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p3
range: cdim_only!B2
rowDimension: 0
columnDimension: 3
drop: '\.'
- PythonCode:
code: |
expected = [
('i1', 'j1', 'k1', 0.1),
('i1', 'j1', 'k3', 0.3),
('i2', 'j2', 'k3', 0.6)
]
data = [(*r.keys, r.value) for r in connect.db['p3']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 3-dim parameter from a full range with cdim=dim
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p3
range: cdim_only!B2:E6
rowDimension: 0
columnDimension: 3
- PythonCode:
code: |
expected = [
('i1', 'j1', 'k1', 0.1),
('i1', 'j1', 'k3', 0.3)
]
data = [(*r.keys, r.value) for r in connect.db['p3']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 1-dimensional parameter from 2-dimensional data (rdim)
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p1
range: multi!B2:C6
rowDimension: 1
columnDimension: 0
- PythonCode:
code: |
expected = [
('i1', 1.),
('i2', 6.),
('i4', 16.)
]
data = [(*r.keys, r.value) for r in connect.db['p1']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 1-dimensional parameter from 2-dimensional data (cdim)
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p1
range: multi!B2:G3
rowDimension: 0
columnDimension: 1
- PythonCode:
code: |
expected = [
('j1', 1.),
('j2', 2.),
('j3', 3.),
('j4', 4.),
('j5', 5.)
]
data = [(*r.keys, r.value) for r in connect.db['p1']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read 3-dim set from a data range with numerical values
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
type: set
symbols:
- name: s3
range: rdim_only!B2:E5
rowDimension: 3
columnDimension: 0
- PythonCode:
code: |
expected = [
('i1', 'j1', 'k1', '0.1'),
('i1', 'j1', 'k3', '0.3')
]
data = [(*r.keys, r.text) for r in connect.db['s3']]
if data != expected:
raise Exception("Unexpected Data")
$offEmbeddedCode
$log read scalar, 1-dim with rdim=0, 1-dim with rdim=1 that are close together
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p0
range: dim0!A1:B2
rowDimension: 0
columnDimension: 0
- name: p1
range: dim0!D1:E4
rowDimension: 1
columnDimension: 0
- name: p1R
range: dim0!G1:J2
rowDimension: 0
columnDimension: 1
- PythonCode:
code: |
expected_p0 = [(3.14,)]
expected_p1 = [('i1', 1.0), ('i2', 2.0), ('i3', 3.0)]
expected_p1R = [('i1', 1.0), ('i2', 2.0), ('i3', 3.0)]
data = [(*r.keys, r.value) for r in connect.db['p0']]
if data != expected_p0:
raise Exception("Unexpected Data p0")
data = [(*r.keys, r.value) for r in connect.db['p1']]
if data != expected_p1:
raise Exception("Unexpected Data p1")
data = [(*r.keys, r.value) for r in connect.db['p1R']]
if data != expected_p1R:
raise Exception("Unexpected Data p1R")
$offEmbeddedCode
$log read scalar, 1-dim with rdim=0, 1-dim with rdim=1 that are very close together
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p0
range: dim0!A5:B7
rowDimension: 0
columnDimension: 0
- name: p1
range: dim0!C5:D8
rowDimension: 1
columnDimension: 0
- name: p1R
range: dim0!E5:H6
rowDimension: 0
columnDimension: 1
- PythonCode:
code: |
expected_p0 = [(3.14,)]
expected_p1 = [('i1', 1.0), ('i2', 2.0), ('i3', 3.0)]
expected_p1R = [('i1', 1.0), ('i2', 2.0), ('i3', 3.0)]
data = [(*r.keys, r.value) for r in connect.db['p0']]
if data != expected_p0:
raise Exception("Unexpected Data p0")
data = [(*r.keys, r.value) for r in connect.db['p1']]
if data != expected_p1:
raise Exception("Unexpected Data p1")
data = [(*r.keys, r.value) for r in connect.db['p1R']]
if data != expected_p1R:
raise Exception("Unexpected Data p1R")
$offEmbeddedCode
$log read parameter with NW:SE and garbage borders
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p1_1
range: nwse!B2:E5
rowDimension: 1
columnDimension: 1
- name: p1_0
range: nwse!B8:C11
rowDimension: 1
columnDimension: 0
- name: p0_1
range: nwse!F8:I9
rowDimension: 0
columnDimension: 1
- name: p2_0
range: nwse!B14:D17
rowDimension: 2
columnDimension: 0
- name: p3_0
range: nwse!G14:J17
rowDimension: 3
columnDimension: 0
- name: p0_2
range: nwse!B21:E24
rowDimension: 0
columnDimension: 2
- name: p0_3
range: nwse!H21:K25
rowDimension: 0
columnDimension: 3
- name: p2_3
range: nwse!B28:F34
rowDimension: 2
columnDimension: 3
- PythonCode:
code: |
expected_p1_1 = [('i1', 'j1', 1.0), ('i1', 'j2', 2.0), ('i1', 'j3', 3.0),
('i2', 'j1', 4.0), ('i2', 'j2', 5.0), ('i2', 'j3', 6.0),
('i3', 'j1', 7.0), ('i3', 'j2', 8.0), ('i3', 'j3', 9.0)]
expected_p1_0 = [('i1', 1.0), ('i2', 4.0), ('i3', 7.0)]
expected_p0_1 = [('j1', 1.0), ('j2', 2.0), ('j3', 3.0)]
expected_p2_0 = [('i1', 'i1', 1.0), ('i2', 'i2', 4.0), ('i3', 'i3', 7.0)]
expected_p3_0 = [('i1', 'i1', 'i1', 1.0), ('i2', 'i2', 'i2', 4.0), ('i3', 'i3', 'i3', 7.0)]
expected_p0_2 = [('j1', 'j1', 1.0), ('j2', 'j2', 2.0), ('j3', 'j3', 3.0)]
expected_p0_3 = [('j1', 'j1', 'j1', 1.0), ('j2', 'j2', 'j2', 2.0), ('j3', 'j3', 'j3', 3.0)]
expected_p2_3 = [('i1', 'i1', 'j1', 'j1', 'j1', 1.0), ('i2', 'i2', 'j2', 'j2', 'j2', 2.0), ('i3', 'i3', 'j3', 'j3', 'j3', 3.0)]
data = [(*r.keys, r.value) for r in connect.db['p1_1']]
if data != expected_p1_1:
raise Exception("Unexpected Data p1_1")
data = [(*r.keys, r.value) for r in connect.db['p1_0']]
if data != expected_p1_0:
raise Exception("Unexpected Data p1_0")
data = [(*r.keys, r.value) for r in connect.db['p0_1']]
if data != expected_p0_1:
raise Exception("Unexpected Data p0_1")
data = [(*r.keys, r.value) for r in connect.db['p2_0']]
if data != expected_p2_0:
raise Exception("Unexpected Data p2_0")
data = [(*r.keys, r.value) for r in connect.db['p3_0']]
if data != expected_p3_0:
raise Exception("Unexpected Data p3_0")
data = [(*r.keys, r.value) for r in connect.db['p0_2']]
if data != expected_p0_2:
raise Exception("Unexpected Data p0_2")
data = [(*r.keys, r.value) for r in connect.db['p0_3']]
if data != expected_p0_3:
raise Exception("Unexpected Data p0_3")
data = [(*r.keys, r.value) for r in connect.db['p2_3']]
if data != expected_p2_3:
raise Exception("Unexpected Data p2_3")
$offEmbeddedCode
$log read parameter with some 0 dim with NW only and garbage border
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
symbols:
- name: p1_0
range: nw0cdim!B2
rowDimension: 1
columnDimension: 0
- name: p0_1
range: nw0rdim!B2
rowDimension: 0
columnDimension: 1
- name: p2_0
range: nw0cdim!F2
rowDimension: 2
columnDimension: 0
- name: p3_0
range: nw0cdim!K2
rowDimension: 3
columnDimension: 0
- name: p0_2
range: nw0rdim!B6
rowDimension: 0
columnDimension: 2
- name: p0_3
range: nw0rdim!B12
rowDimension: 0
columnDimension: 3
- PythonCode:
code: |
expected_p1_0 = [('i1', 1.0), ('i2', 4.0), ('i3', 7.0)]
expected_p0_1 = [('j1', 1.0), ('j2', 2.0), ('j3', 3.0)]
expected_p2_0 = [('i1', 'i1', 1.0), ('i2', 'i2', 4.0), ('i3', 'i3', 7.0)]
expected_p3_0 = [('i1', 'i1', 'i1', 1.0), ('i2', 'i2', 'i2', 4.0), ('i3', 'i3', 'i3', 7.0)]
expected_p0_2 = [('j1', 'j1', 1.0), ('j2', 'j2', 2.0), ('j3', 'j3', 3.0)]
expected_p0_3 = [('j1', 'j1', 'j1', 1.0), ('j2', 'j2', 'j2', 2.0), ('j3', 'j3', 'j3', 3.0)]
data = [(*r.keys, r.value) for r in connect.db['p1_0']]
if data != expected_p1_0:
raise Exception("Unexpected Data p1_0")
data = [(*r.keys, r.value) for r in connect.db['p0_1']]
if data != expected_p0_1:
raise Exception("Unexpected Data p0_1")
data = [(*r.keys, r.value) for r in connect.db['p2_0']]
if data != expected_p2_0:
raise Exception("Unexpected Data p2_0")
data = [(*r.keys, r.value) for r in connect.db['p3_0']]
if data != expected_p3_0:
raise Exception("Unexpected Data p3_0")
data = [(*r.keys, r.value) for r in connect.db['p0_2']]
if data != expected_p0_2:
raise Exception("Unexpected Data p0_2")
data = [(*r.keys, r.value) for r in connect.db['p0_3']]
if data != expected_p0_3:
raise Exception("Unexpected Data p0_3")
$offEmbeddedCode
$log read parameter with cdim>1 but no extra blank link with NW:SE and NW (for rdim=0) and garbage borders
$onEmbeddedCode Connect:
- PandasExcelReader:
file: capdxlsr.xlsx
multiColumnBlankRow: False
symbols:
- name: p0_2
range: cdim2tight!B2:E4
rowDimension: 0
columnDimension: 2
- name: p0_3
range: cdim2tight!B7:E10
rowDimension: 0
columnDimension: 3
- name: p2_3
range: cdim2tight!B13:F18
rowDimension: 2
columnDimension: 3
- name: p2_3x
range: cdim2tight!B21:F26
rowDimension: 2
columnDimension: 3
- name: s2_3 # Works unexpectedly (row 46 as a totally blank row is interpreted as index name row, not as data):
range: cdim2tight!B43
rowDimension: 2
columnDimension: 3
type: set
valueSubstitutions: { .nan: '' }
- name: p0_2x
range: cdim2tight!B29
rowDimension: 0
columnDimension: 2
- name: p0_3x
range: cdim2tight!B34
rowDimension: 0
columnDimension: 3
- PythonCode:
code: |
expected_p0_2 = [('j1', 'j1', 1.0), ('j2', 'j2', 2.0), ('j3', 'j3', 3.0)]
expected_p0_3 = [('j1', 'j1', 'j1', 1.0), ('j2', 'j2', 'j2', 2.0), ('j3', 'j3', 'j3', 3.0)]
expected_p2_3 = [('i1', 'i1', 'j1', 'j1', 'j1', 1.0), ('i2', 'i2', 'j2', 'j2', 'j2', 2.0), ('i3', 'i3', 'j3', 'j3', 'j3', 3.0)]
expected_p2_3x = [('i2', 'i2', 'j2', 'j2', 'j2', 2.0), ('i3', 'i3', 'j3', 'j3', 'j3', 3.0)]
expected_s2_3 = [('i2', 'i3', 'j1', 'j1', 'j1', ''), ('i2', 'i3', 'j2', 'j2', 'j2', '2.0'),
('i2', 'i3', 'j3', 'j3', 'j3', ''), ('i2', 'i3', 'j4', 'j4', 'j4', ''),
('i3', 'i4', 'j1', 'j1', 'j1', ''), ('i3', 'i4', 'j2', 'j2', 'j2', ''),
('i3', 'i4', 'j3', 'j3', 'j3', '3.0'), ('i3', 'i4', 'j4', 'j4', 'j4', '')]
data = [(*r.keys, r.value) for r in connect.db['p0_2']]
if data != expected_p0_2:
raise Exception("Unexpected Data p0_2")
data = [(*r.keys, r.value) for r in connect.db['p0_3']]
if data != expected_p0_3:
raise Exception("Unexpected Data p0_3")
data = [(*r.keys, r.value) for r in connect.db['p2_3']]
if data != expected_p2_3:
raise Exception("Unexpected Data p2_3")
data = [(*r.keys, r.value) for r in connect.db['p2_3x']]
if data != expected_p2_3x:
raise Exception("Unexpected Data p2_3x")
data = [(*r.keys, r.value) for r in connect.db['p0_2x']]
if data != expected_p0_2:
raise Exception("Unexpected Data p0_2x")
data = [(*r.keys, r.value) for r in connect.db['p0_3x']]
if data != expected_p0_3:
raise Exception("Unexpected Data p0_3x")
data = [(*r.keys, r.text) for r in connect.db['s2_3']]
if data != expected_s2_3:
raise Exception("Unexpected Data s2_3")
$offEmbeddedCode