@@ -1506,6 +1506,160 @@ TEST_CASE("PythonCompiler lists") {
15061506 CHECK (e.aggregate_type_to_string (r.result ) == " [\" lfortran\" , \" lpython\" , \" lc\" ]" );
15071507}
15081508
1509+ TEST_CASE (" PythonCompiler tuples" ) {
1510+ CompilerOptions cu;
1511+ cu.po .disable_main = true ;
1512+ cu.emit_debug_line_column = false ;
1513+ cu.generate_object_code = false ;
1514+ cu.interactive = true ;
1515+ cu.po .runtime_library_dir = LCompilers::LPython::get_runtime_library_dir ();
1516+ PythonCompiler e (cu);
1517+ LCompilers::Result<PythonCompiler::EvalResult>
1518+
1519+ r = e.evaluate2 (" (1, 2)" );
1520+ CHECK (r.ok );
1521+ CHECK (r.result .type == PythonCompiler::EvalResult::struct_type);
1522+ CHECK (LCompilers::ASRUtils::get_type_code (r.result .structure .ttype ) == " tuple[i32, i32]" );
1523+ CHECK (e.aggregate_type_to_string (r.result ) == " (1, 2)" );
1524+
1525+ r = e.evaluate2 (" (1, 2, 2.5)" );
1526+ CHECK (r.ok );
1527+ CHECK (r.result .type == PythonCompiler::EvalResult::struct_type);
1528+ CHECK (LCompilers::ASRUtils::get_type_code (r.result .structure .ttype ) == " tuple[i32, i32, r64]" );
1529+ CHECK (e.aggregate_type_to_string (r.result ) == " (1, 2, 2.500000)" );
1530+
1531+ r = e.evaluate2 (" (1, 2, 2.5, \" LPython\" )" );
1532+ CHECK (r.ok );
1533+ CHECK (r.result .type == PythonCompiler::EvalResult::struct_type);
1534+ CHECK (LCompilers::ASRUtils::get_type_code (r.result .structure .ttype ) == " tuple[i32, i32, r64, str]" );
1535+ CHECK (e.aggregate_type_to_string (r.result ) == " (1, 2, 2.500000, \" LPython\" )" );
1536+
1537+ r = e.evaluate2 (" (1, 2, 2.5, \" LPython\" , True)" );
1538+ CHECK (r.ok );
1539+ CHECK (r.result .type == PythonCompiler::EvalResult::struct_type);
1540+ CHECK (LCompilers::ASRUtils::get_type_code (r.result .structure .ttype ) == " tuple[i32, i32, r64, str, i1]" );
1541+ CHECK (e.aggregate_type_to_string (r.result ) == " (1, 2, 2.500000, \" LPython\" , True)" );
1542+
1543+ r = e.evaluate2 (" (i8(1), i16(1), i64(1))" );
1544+ CHECK (r.ok );
1545+ CHECK (r.result .type == PythonCompiler::EvalResult::struct_type);
1546+ CHECK (LCompilers::ASRUtils::get_type_code (r.result .structure .ttype ) == " tuple[i8, i16, i64]" );
1547+ CHECK (e.aggregate_type_to_string (r.result ) == " (1, 1, 1)" );
1548+
1549+ r = e.evaluate2 (" (f32(1.0),)" );
1550+ CHECK (r.ok );
1551+ CHECK (r.result .type == PythonCompiler::EvalResult::struct_type);
1552+ CHECK (LCompilers::ASRUtils::get_type_code (r.result .structure .ttype ) == " tuple[r32]" );
1553+ CHECK (e.aggregate_type_to_string (r.result ) == " (1.000000)" );
1554+ }
1555+
1556+ TEST_CASE (" PythonCompiler classes" ) {
1557+ CompilerOptions cu;
1558+ cu.po .disable_main = true ;
1559+ cu.emit_debug_line_column = false ;
1560+ cu.generate_object_code = false ;
1561+ cu.interactive = true ;
1562+ cu.po .runtime_library_dir = LCompilers::LPython::get_runtime_library_dir ();
1563+ PythonCompiler e (cu);
1564+ LCompilers::Result<PythonCompiler::EvalResult>
1565+
1566+ r = e.evaluate2 (R"(
1567+ @dataclass
1568+ class MyClass1:
1569+ x: i32
1570+ )" );
1571+ CHECK (r.ok );
1572+ CHECK (r.result .type == PythonCompiler::EvalResult::none);
1573+
1574+ r = e.evaluate2 (" c1: MyClass1 = MyClass1(12)" );
1575+ CHECK (r.ok );
1576+ CHECK (r.result .type == PythonCompiler::EvalResult::statement);
1577+
1578+ r = e.evaluate2 (" c1" );
1579+ CHECK (r.ok );
1580+ CHECK (r.result .type == PythonCompiler::EvalResult::struct_type);
1581+ CHECK (e.aggregate_type_to_string (r.result ) == " MyClass1(x=12)" );
1582+
1583+ r = e.evaluate2 (R"(
1584+ @dataclass
1585+ class MyClass2:
1586+ i: i32
1587+ f: f64
1588+ )" );
1589+ CHECK (r.ok );
1590+ CHECK (r.result .type == PythonCompiler::EvalResult::none);
1591+
1592+ r = e.evaluate2 (" c2: MyClass2 = MyClass2(12, 2.5)" );
1593+ CHECK (r.ok );
1594+ CHECK (r.result .type == PythonCompiler::EvalResult::statement);
1595+
1596+ r = e.evaluate2 (" c2" );
1597+ CHECK (r.ok );
1598+ CHECK (r.result .type == PythonCompiler::EvalResult::struct_type);
1599+ CHECK (e.aggregate_type_to_string (r.result ) == " MyClass2(i=12, f=2.500000)" );
1600+
1601+ r = e.evaluate2 (R"(
1602+ @dataclass
1603+ class MyClass3:
1604+ i: i32
1605+ f: f64
1606+ s: str
1607+ )" );
1608+ CHECK (r.ok );
1609+ CHECK (r.result .type == PythonCompiler::EvalResult::none);
1610+
1611+ r = e.evaluate2 (" c3: MyClass3 = MyClass3(12, 2.5, \" LPython\" )" );
1612+ CHECK (r.ok );
1613+ CHECK (r.result .type == PythonCompiler::EvalResult::statement);
1614+
1615+ r = e.evaluate2 (" c3" );
1616+ CHECK (r.ok );
1617+ CHECK (r.result .type == PythonCompiler::EvalResult::struct_type);
1618+ CHECK (e.aggregate_type_to_string (r.result ) == " MyClass3(i=12, f=2.500000, s=\" LPython\" )" );
1619+
1620+ r = e.evaluate2 (R"(
1621+ @dataclass
1622+ class MyClass4:
1623+ i_1: bool
1624+ i_8: i8
1625+ i_16: i16
1626+ i_32: i32
1627+ i_64: i64
1628+ )" );
1629+ CHECK (r.ok );
1630+ CHECK (r.result .type == PythonCompiler::EvalResult::none);
1631+
1632+ r = e.evaluate2 (" c4: MyClass4 = MyClass4(True, i8(2), i16(3), i32(4), i64(5))" );
1633+ CHECK (r.ok );
1634+ CHECK (r.result .type == PythonCompiler::EvalResult::statement);
1635+
1636+ r = e.evaluate2 (" c4" );
1637+ CHECK (r.ok );
1638+ CHECK (r.result .type == PythonCompiler::EvalResult::struct_type);
1639+ // CHECK(e.aggregate_type_to_string(r.result) == "MyClass4(i_1=True, i_8=2, i_16=3, i_32=4, i_64=5)"); // FIXME: look at issue #2793
1640+
1641+ r = e.evaluate2 (R"(
1642+ @dataclass
1643+ class MyClass5:
1644+ u_1: bool
1645+ u_8: u8
1646+ u_16: u16
1647+ u_32: u32
1648+ u_64: u64
1649+ )" );
1650+ CHECK (r.ok );
1651+ CHECK (r.result .type == PythonCompiler::EvalResult::none);
1652+
1653+ r = e.evaluate2 (" c5: MyClass5 = MyClass5(False, u8(2), u16(3), u32(4), u64(5))" );
1654+ CHECK (r.ok );
1655+ CHECK (r.result .type == PythonCompiler::EvalResult::statement);
1656+
1657+ r = e.evaluate2 (" c5" );
1658+ CHECK (r.ok );
1659+ CHECK (r.result .type == PythonCompiler::EvalResult::struct_type);
1660+ CHECK (e.aggregate_type_to_string (r.result ) == " MyClass5(u_1=False, u_8=2, u_16=3, u_32=4, u_64=5)" );
1661+ }
1662+
15091663TEST_CASE (" PythonCompiler underscore 1" ) {
15101664 CompilerOptions cu;
15111665 cu.po .disable_main = true ;
0 commit comments