| | 1736 | //------------------------------------------------------------------------------ |
|---|
| | 1737 | |
|---|
| | 1738 | unittest { |
|---|
| | 1739 | testGroup.begin("Binary Archive"); |
|---|
| | 1740 | } |
|---|
| | 1741 | |
|---|
| | 1742 | //------------------------------------------------------------------------------ |
|---|
| | 1743 | |
|---|
| | 1744 | unittest { testCase.execute("load/dump - string/wstring/dstring", { |
|---|
| | 1745 | string input; |
|---|
| | 1746 | ubyte[] output; |
|---|
| | 1747 | wstring winput; |
|---|
| | 1748 | dstring dinput; |
|---|
| | 1749 | |
|---|
| | 1750 | |
|---|
| | 1751 | input = "pójdźŌe, kiÅ tÄ chmurnoÅÄ w gÅÄ |
|---|
| | 1752 | b flaszy!"; |
|---|
| | 1753 | winput = "pójdźŌe, kiÅ tÄ chmurnoÅÄ w gÅÄ |
|---|
| | 1754 | b flaszy!"w; |
|---|
| | 1755 | dinput = "pójdźŌe, kiÅ tÄ chmurnoÅÄ w gÅÄ |
|---|
| | 1756 | b flaszy!"d; |
|---|
| | 1757 | output = binserializer.dump(input); |
|---|
| | 1758 | trace(output); |
|---|
| | 1759 | assert(binserializer.load!(string)(output) == input); |
|---|
| | 1760 | output = binserializer.dump(winput); |
|---|
| | 1761 | trace(output); |
|---|
| | 1762 | assert(binserializer.load!(wstring)(output) == winput); |
|---|
| | 1763 | output = binserializer.dump(dinput); |
|---|
| | 1764 | trace(output); |
|---|
| | 1765 | assert(binserializer.load!(dstring)(output) == dinput); |
|---|
| | 1766 | });} |
|---|
| | 1767 | |
|---|
| | 1768 | //------------------------------------------------------------------------------ |
|---|
| | 1769 | |
|---|
| | 1770 | unittest { testCase.execute("load/dump - bool", { |
|---|
| | 1771 | bool input; |
|---|
| | 1772 | ubyte[] output; |
|---|
| | 1773 | |
|---|
| | 1774 | input = true; |
|---|
| | 1775 | output = binserializer.dump(input); |
|---|
| | 1776 | assert(binserializer.load!(bool)(output) == input); |
|---|
| | 1777 | |
|---|
| | 1778 | input = false; |
|---|
| | 1779 | output = binserializer.dump(input); |
|---|
| | 1780 | assert(binserializer.load!(bool)(output) == input); |
|---|
| | 1781 | });} |
|---|
| | 1782 | |
|---|
| | 1783 | ////------------------------------------------------------------------------------ |
|---|
| | 1784 | |
|---|
| | 1785 | unittest { testCase.execute("load/dump - char", { |
|---|
| | 1786 | char input; |
|---|
| | 1787 | ubyte[] output; |
|---|
| | 1788 | |
|---|
| | 1789 | input = 'a'; |
|---|
| | 1790 | output = binserializer.dump(input); |
|---|
| | 1791 | assert(binserializer.load!(char)(output) == input); |
|---|
| | 1792 | |
|---|
| | 1793 | input = 'A'; |
|---|
| | 1794 | output = binserializer.dump(input); |
|---|
| | 1795 | assert(binserializer.load!(char)(output) == input); |
|---|
| | 1796 | });} |
|---|
| | 1797 | |
|---|
| | 1798 | //------------------------------------------------------------------------------ |
|---|
| | 1799 | |
|---|
| | 1800 | import std.stdio; |
|---|
| | 1801 | unittest { testCase.execute("load/dump - atomic types", { |
|---|
| | 1802 | int input_int; |
|---|
| | 1803 | uint input_uint; |
|---|
| | 1804 | float input_float; |
|---|
| | 1805 | cfloat input_cfloat; |
|---|
| | 1806 | real input_real; |
|---|
| | 1807 | creal input_creal; |
|---|
| | 1808 | ireal input_ireal; |
|---|
| | 1809 | |
|---|
| | 1810 | ubyte[] output; |
|---|
| | 1811 | |
|---|
| | 1812 | input_int = -15; |
|---|
| | 1813 | output = binserializer.dump(input_int); |
|---|
| | 1814 | assert(binserializer.load!(int)(output) == input_int); |
|---|
| | 1815 | |
|---|
| | 1816 | input_uint = 1774; |
|---|
| | 1817 | output = binserializer.dump(input_uint); |
|---|
| | 1818 | assert(binserializer.load!(uint)(output) == input_uint); |
|---|
| | 1819 | |
|---|
| | 1820 | input_float = 1.123; |
|---|
| | 1821 | output = binserializer.dump(input_float); |
|---|
| | 1822 | assert(binserializer.load!(float)(output) == input_float); |
|---|
| | 1823 | |
|---|
| | 1824 | input_real = 3.14159_26535_89793_23846_26433_83279_50288_41971_69399; |
|---|
| | 1825 | output = binserializer.dump(input_real); |
|---|
| | 1826 | assert(binserializer.load!(real)(output) == input_real); |
|---|
| | 1827 | |
|---|
| | 1828 | input_cfloat = 1774 + 12.fi; |
|---|
| | 1829 | output = binserializer.dump(input_cfloat); |
|---|
| | 1830 | assert(binserializer.load!(cfloat)(output) == input_cfloat); |
|---|
| | 1831 | |
|---|
| | 1832 | input_creal = 1774 + 12i; |
|---|
| | 1833 | output = binserializer.dump(input_creal); |
|---|
| | 1834 | assert(binserializer.load!(creal)(output) == input_creal); |
|---|
| | 1835 | |
|---|
| | 1836 | input_ireal = 1774i; |
|---|
| | 1837 | output = binserializer.dump(input_ireal); |
|---|
| | 1838 | assert(binserializer.load!(ireal)(output) == input_ireal); |
|---|
| | 1839 | });} |
|---|
| | 1840 | |
|---|
| | 1841 | //------------------------------------------------------------------------------ |
|---|
| | 1842 | unittest { testCase.execute("load/dump - int arrays", { |
|---|
| | 1843 | int[] input_int1; |
|---|
| | 1844 | int[][] input_int2; |
|---|
| | 1845 | int[][][] input_int3; |
|---|
| | 1846 | OpaqueClass[] input_class1; |
|---|
| | 1847 | TransparentClass[] input_class2; |
|---|
| | 1848 | OpaqueStruct[] input_struct1; |
|---|
| | 1849 | |
|---|
| | 1850 | ubyte[] output; |
|---|
| | 1851 | |
|---|
| | 1852 | input_int1 = [-1,45,34,-100,34]; |
|---|
| | 1853 | output = binserializer.dump(input_int1); |
|---|
| | 1854 | trace(output); |
|---|
| | 1855 | //trace(binserializer.load!(int[])(output)); |
|---|
| | 1856 | assert(binserializer.load!(int[])(output) == input_int1); |
|---|
| | 1857 | |
|---|
| | 1858 | |
|---|
| | 1859 | input_int2 = [[], [], []]; |
|---|
| | 1860 | output = binserializer.dump(input_int2); |
|---|
| | 1861 | assert(binserializer.load!(int[][])(output) == input_int2); |
|---|
| | 1862 | |
|---|
| | 1863 | |
|---|
| | 1864 | input_int3 = [[[2,3],[4,5],[6,7]], [[]], [[0,-5],[-8,1]]]; |
|---|
| | 1865 | output = binserializer.dump(input_int3); |
|---|
| | 1866 | assert(binserializer.load!(int[][][])(output) == input_int3); |
|---|
| | 1867 | |
|---|
| | 1868 | |
|---|
| | 1869 | //BUG: low precision: -5642.2321 would be wrong value |
|---|
| | 1870 | auto oc1 = new OpaqueClass(-567, float.nan, "class1", 22, -43); |
|---|
| | 1871 | auto oc2 = new OpaqueClass(234, 0.11, "class2", 28, -27); |
|---|
| | 1872 | auto oc3 = new OpaqueClass(2121, -4.00, "class1", 0, 21); |
|---|
| | 1873 | input_class1 = [oc1, oc2, oc3, null, null, oc1, oc1]; |
|---|
| | 1874 | output = binserializer.dump(input_class1); |
|---|
| | 1875 | trace(output); |
|---|
| | 1876 | auto pom = binserializer.load!(OpaqueClass[])(output); |
|---|
| | 1877 | trace(binserializer.dump(pom)); |
|---|
| | 1878 | assert(compareArrays(binserializer.load!(OpaqueClass[])(output), input_class1)); |
|---|
| | 1879 | |
|---|
| | 1880 | auto tc1 = new TransparentClass(-567, -5642.23, "class1", 22, -43); |
|---|
| | 1881 | auto tc2 = new TransparentClass(2121, -4.00, "class2", 0, 21); |
|---|
| | 1882 | |
|---|
| | 1883 | input_class2 = [tc1, null, tc2]; |
|---|
| | 1884 | output = binserializer.dump(input_class2); |
|---|
| | 1885 | trace(output); |
|---|
| | 1886 | assert(compareArrays(binserializer.load!(TransparentClass[])(output), input_class2)); |
|---|
| | 1887 | });} |
|---|
| | 1888 | |
|---|
| | 1889 | //------------------------------------------------------------------------------ |
|---|
| | 1890 | |
|---|
| | 1891 | unittest { testCase.execute("load/dump - class arrays", { |
|---|
| | 1892 | OpaqueClass[] input_class1; |
|---|
| | 1893 | TransparentClass[] input_class2; |
|---|
| | 1894 | OpaqueStruct[] input_struct1; |
|---|
| | 1895 | |
|---|
| | 1896 | ubyte[] output; |
|---|
| | 1897 | |
|---|
| | 1898 | //BUG: low precision: -5642.2321 would be wrong value |
|---|
| | 1899 | auto oc1 = new OpaqueClass(-567, -5642.23, "class1", 22, -43); |
|---|
| | 1900 | auto oc2 = new OpaqueClass(234, 0.11, "class2", 28, -27); |
|---|
| | 1901 | auto oc3 = new OpaqueClass(2121, -4.00, "class1", 0, 21); |
|---|
| | 1902 | input_class1 = [oc1, oc2, oc3, null, null, oc1, oc1]; |
|---|
| | 1903 | output = binserializer.dump(input_class1); |
|---|
| | 1904 | trace(output); |
|---|
| | 1905 | //TODO: zmieniÄ nazwÄ z compareArrays |
|---|
| | 1906 | assert(compareArrays(binserializer.load!(OpaqueClass[])(output), input_class1)); |
|---|
| | 1907 | |
|---|
| | 1908 | auto tc1 = new TransparentClass(-567, -5642.23, "class1", 22, -43); |
|---|
| | 1909 | auto tc2 = new TransparentClass(2121, -4.00, "class2", 0, 21); |
|---|
| | 1910 | |
|---|
| | 1911 | input_class2 = [tc1, null, tc2]; |
|---|
| | 1912 | output = binserializer.dump(input_class2); |
|---|
| | 1913 | trace(output); |
|---|
| | 1914 | assert(compareArrays(binserializer.load!(TransparentClass[])(output), input_class2)); |
|---|
| | 1915 | });} |
|---|
| | 1916 | |
|---|
| | 1917 | //------------------------------------------------------------------------------ |
|---|
| | 1918 | |
|---|
| | 1919 | unittest { testCase.execute("load/dump - static arrays", { |
|---|
| | 1920 | string[6] input_string; |
|---|
| | 1921 | real[3] input_real; |
|---|
| | 1922 | int[4] input_int; |
|---|
| | 1923 | TransparentComposedStruct[3] input_cstruct; |
|---|
| | 1924 | OpaqueComposedStruct[3] input_ocstruct; |
|---|
| | 1925 | |
|---|
| | 1926 | ubyte[] output; |
|---|
| | 1927 | |
|---|
| | 1928 | input_int[0]=5; input_int[1]=10; input_int[2]=15; input_int[3]=20; |
|---|
| | 1929 | output = binserializer.dump(input_int); |
|---|
| | 1930 | assert(binserializer.load!(int[5])(output) == input_int); |
|---|
| | 1931 | |
|---|
| | 1932 | input_string[0]="Raz"; input_string[1]="Dwa"; input_string[2]="Trzy"; |
|---|
| | 1933 | input_string[3]="Cztery"; input_string[4]="PiÄÄ"; input_string[5]="SzeÅÄ"; |
|---|
| | 1934 | output = binserializer.dump(input_string); |
|---|
| | 1935 | assert(binserializer.load!(string[6])(output) == input_string); |
|---|
| | 1936 | |
|---|
| | 1937 | input_real[0]=3.14; input_real[0]=2.01; input_real[0]=-15.76; |
|---|
| | 1938 | output = binserializer.dump(input_real); |
|---|
| | 1939 | assert(binserializer.load!(real[6])(output) == input_real); |
|---|
| | 1940 | |
|---|
| | 1941 | input_cstruct[0]=TransparentComposedStruct([1,2,3,4,5]); |
|---|
| | 1942 | input_cstruct[1]=TransparentComposedStruct([-100, -99, -98, -97, 0]); |
|---|
| | 1943 | input_cstruct[2]=TransparentComposedStruct([1,22,333,4444,55555]); |
|---|
| | 1944 | output = binserializer.dump(input_cstruct); |
|---|
| | 1945 | assert(binserializer.load!(TransparentComposedStruct[3])(output) == input_cstruct); |
|---|
| | 1946 | |
|---|
| | 1947 | input_ocstruct[0]=OpaqueComposedStruct([6,7,8,9,10]); |
|---|
| | 1948 | input_ocstruct[1]=OpaqueComposedStruct([-1000, +900, -800, +700, 0]); |
|---|
| | 1949 | input_ocstruct[2]=OpaqueComposedStruct([-1,-22,-333,-4444,-55555]); |
|---|
| | 1950 | output = binserializer.dump(input_ocstruct); |
|---|
| | 1951 | assert(binserializer.load!(OpaqueComposedStruct[3])(output) == input_ocstruct); |
|---|
| | 1952 | });} |
|---|
| | 1953 | |
|---|
| | 1954 | //------------------------------------------------------------------------------ |
|---|
| | 1955 | |
|---|
| | 1956 | unittest { testCase.execute("load/dump - associative arrays", { |
|---|
| | 1957 | char[][int] input, result; |
|---|
| | 1958 | ubyte[] output; |
|---|
| | 1959 | |
|---|
| | 1960 | input = [1 : "Maciek"[], 2 : "PaweÅ", 45 : "Renata"]; |
|---|
| | 1961 | output = binserializer.dump(input); |
|---|
| | 1962 | result = binserializer.load!(char[][int])(output); |
|---|
| | 1963 | assert(result.keys == [1,2,45]); |
|---|
| | 1964 | assert(result.values == ["Maciek"[], "PaweÅ", "Renata"]); |
|---|
| | 1965 | //assert(result == input_1); |
|---|
| | 1966 | });} |
|---|
| | 1967 | |
|---|
| | 1968 | //------------------------------------------------------------------------------ |
|---|
| | 1969 | |
|---|
| | 1970 | unittest { testCase.execute("load/dump - transparent classes", { |
|---|
| | 1971 | TransparentClass input; |
|---|
| | 1972 | ubyte[] output; |
|---|
| | 1973 | |
|---|
| | 1974 | input = new TransparentClass(-21, 2.11, "text1", 128, -127); |
|---|
| | 1975 | output = binserializer.dump(input); |
|---|
| | 1976 | assert(binserializer.load!(TransparentClass)(output) == input); |
|---|
| | 1977 | });} |
|---|
| | 1978 | |
|---|
| | 1979 | //------------------------------------------------------------------------------ |
|---|
| | 1980 | |
|---|
| | 1981 | unittest { testCase.execute("load/dump - opaque classes", { |
|---|
| | 1982 | OpaqueClass input; |
|---|
| | 1983 | ubyte[] output; |
|---|
| | 1984 | |
|---|
| | 1985 | input = new OpaqueClass(-21, 2.11, "text1", 128, -127); |
|---|
| | 1986 | output = binserializer.dump(input); |
|---|
| | 1987 | assert(binserializer.load!(OpaqueClass)(output) == input); |
|---|
| | 1988 | });} |
|---|
| | 1989 | |
|---|
| | 1990 | //------------------------------------------------------------------------------ |
|---|
| | 1991 | |
|---|
| | 1992 | unittest { testCase.execute("load/dump - transparent structs", { |
|---|
| | 1993 | TransparentStruct input; |
|---|
| | 1994 | ubyte[] output; |
|---|
| | 1995 | |
|---|
| | 1996 | input = TransparentStruct(-21, 2.11, "text1"); |
|---|
| | 1997 | output = binserializer.dump(input); |
|---|
| | 1998 | assert(binserializer.load!(TransparentStruct)(output) == input); |
|---|
| | 1999 | });} |
|---|
| | 2000 | |
|---|
| | 2001 | //------------------------------------------------------------------------------ |
|---|
| | 2002 | |
|---|
| | 2003 | unittest { testCase.execute("load/dump - opaque structs", { |
|---|
| | 2004 | OpaqueStruct input; |
|---|
| | 2005 | ubyte[] output; |
|---|
| | 2006 | |
|---|
| | 2007 | input = OpaqueStruct(-21, 2.11, "text1"); |
|---|
| | 2008 | output = binserializer.dump(input); |
|---|
| | 2009 | trace(output); |
|---|
| | 2010 | assert(binserializer.load!(OpaqueStruct)(output) == input); |
|---|
| | 2011 | });} |
|---|
| | 2012 | |
|---|
| | 2013 | //------------------------------------------------------------------------------ |
|---|
| | 2014 | |
|---|
| | 2015 | unittest { testCase.execute("load/dump - typedefs", { |
|---|
| | 2016 | typedef int MyInt; |
|---|
| | 2017 | typedef string MyString; |
|---|
| | 2018 | typedef OpaqueStruct OS; |
|---|
| | 2019 | typedef OpaqueClass OC; |
|---|
| | 2020 | |
|---|
| | 2021 | MyInt input_int; |
|---|
| | 2022 | MyString input_string; |
|---|
| | 2023 | OS input_struct; |
|---|
| | 2024 | OC input_class; |
|---|
| | 2025 | |
|---|
| | 2026 | ubyte[] output; |
|---|
| | 2027 | |
|---|
| | 2028 | input_int = 45; |
|---|
| | 2029 | output = binserializer.dump(input_int); |
|---|
| | 2030 | assert(binserializer.load!(MyInt)(output) == input_int); |
|---|
| | 2031 | |
|---|
| | 2032 | input_string = cast(MyString)"my string".dup; |
|---|
| | 2033 | output = binserializer.dump(input_string); |
|---|
| | 2034 | assert(binserializer.load!(MyString)(output) == input_string); |
|---|
| | 2035 | |
|---|
| | 2036 | input_struct = OS(-21, 2.11, "text1");; |
|---|
| | 2037 | output = binserializer.dump(input_struct); |
|---|
| | 2038 | assert(binserializer.load!(OS)(output) == input_struct); |
|---|
| | 2039 | |
|---|
| | 2040 | input_class = cast(OC) new OpaqueClass(-21, 2.11, "text1", 23,98); |
|---|
| | 2041 | output = binserializer.dump(input_class); |
|---|
| | 2042 | //BUG: dmd hangs here... |
|---|
| | 2043 | //assert(binserializer.load!(OC)(output) == input_class); |
|---|
| | 2044 | });} |
|---|
| | 2045 | |
|---|
| | 2046 | //------------------------------------------------------------------------------ |
|---|
| | 2047 | |
|---|
| | 2048 | unittest { testCase.execute("load/dump - pointers", { |
|---|
| | 2049 | OpaqueStruct* input_struct; |
|---|
| | 2050 | OpaqueClass input_class; |
|---|
| | 2051 | OpaqueClass* p; |
|---|
| | 2052 | int*[] input_pint; |
|---|
| | 2053 | ubyte[] output; |
|---|
| | 2054 | int[4] ints = [23, 56, 89, 76]; |
|---|
| | 2055 | int**[] input_ppint; |
|---|
| | 2056 | |
|---|
| | 2057 | |
|---|
| | 2058 | input_pint = [&ints[0], &ints[1], null, &ints[2], &ints[3], &ints[1], &ints[2], &ints[1]]; |
|---|
| | 2059 | output = binserializer.dump(input_pint); |
|---|
| | 2060 | trace(output); |
|---|
| | 2061 | |
|---|
| | 2062 | foreach(i, v; binserializer.load!(int*[])(output)) { |
|---|
| | 2063 | if (v is null || input_pint[i] is null) { |
|---|
| | 2064 | //trace("Values: ", v, " == ", input_pint[i]); |
|---|
| | 2065 | assert(v is input_pint[i]); |
|---|
| | 2066 | continue; |
|---|
| | 2067 | } |
|---|
| | 2068 | //trace("Values: ", *v, " == ", *input_pint[i]); |
|---|
| | 2069 | assert(*v == *input_pint[i]); |
|---|
| | 2070 | } |
|---|
| | 2071 | |
|---|
| | 2072 | input_ppint = [&input_pint[0], &input_pint[1], &input_pint[2], &input_pint[6], &input_pint[7]]; |
|---|
| | 2073 | output = binserializer.dump(input_ppint); |
|---|
| | 2074 | trace(output); |
|---|
| | 2075 | foreach(i, v; binserializer.load!(int**[])(output)) { |
|---|
| | 2076 | if (v is null || input_ppint[i] is null) { |
|---|
| | 2077 | trace("Values: ", v, " == ", input_ppint[i]); |
|---|
| | 2078 | assert(v is input_ppint[i]); |
|---|
| | 2079 | continue; |
|---|
| | 2080 | } |
|---|
| | 2081 | |
|---|
| | 2082 | if (*v is null || *input_ppint[i] is null) { |
|---|
| | 2083 | trace("Values: ", *v, " == ", *input_ppint[i]); |
|---|
| | 2084 | assert(*v is *input_ppint[i]); |
|---|
| | 2085 | continue; |
|---|
| | 2086 | } |
|---|
| | 2087 | |
|---|
| | 2088 | trace("Values: ", **v, " == ", **input_ppint[i]); |
|---|
| | 2089 | assert(**v == **input_ppint[i]); |
|---|
| | 2090 | } |
|---|
| | 2091 | |
|---|
| | 2092 | input_struct = &OpaqueStruct(-21, 2.11, "text1"); |
|---|
| | 2093 | output = binserializer.dump(input_struct); |
|---|
| | 2094 | trace(output); |
|---|
| | 2095 | assert(*binserializer.load!(OpaqueStruct*)(output) == *input_struct); |
|---|
| | 2096 | |
|---|
| | 2097 | input_class = new OpaqueClass(-123, 0, "opaque class", 64, 0); |
|---|
| | 2098 | p = &input_class; |
|---|
| | 2099 | output = binserializer.dump(p); |
|---|
| | 2100 | trace(output); |
|---|
| | 2101 | assert(*binserializer.load!(OpaqueClass*)(output) == input_class); |
|---|
| | 2102 | |
|---|
| | 2103 | //TODO: sprawdziÄ czy dobrze zachowujÄ |
|---|
| | 2104 | siÄ takie typy jak Class**** |
|---|
| | 2105 | });} |
|---|
| | 2106 | |
|---|
| | 2107 | //------------------------------------------------------------------------------ |
|---|
| | 2108 | |
|---|
| | 2109 | unittest { testCase.execute("load/dump - tracking", { |
|---|
| | 2110 | binserializer.global().tracking = Tracking.OFF; |
|---|
| | 2111 | |
|---|
| | 2112 | OpaqueStruct* input_struct; |
|---|
| | 2113 | int*[] input_pint; |
|---|
| | 2114 | ubyte[] output; |
|---|
| | 2115 | int[4] ints = [23, 56, 89, 76]; |
|---|
| | 2116 | |
|---|
| | 2117 | input_pint = [&ints[0], &ints[1], null, &ints[2], &ints[3], &ints[1], &ints[2], &ints[1]]; |
|---|
| | 2118 | output = binserializer.dump(input_pint); |
|---|
| | 2119 | |
|---|
| | 2120 | foreach(i, v; binserializer.load!(int*[])(output)) { |
|---|
| | 2121 | if (v is null || input_pint[i] is null) { |
|---|
| | 2122 | trace("Values: ", v, " == ", input_pint[i]); |
|---|
| | 2123 | assert(v is input_pint[i]); |
|---|
| | 2124 | continue; |
|---|
| | 2125 | } |
|---|
| | 2126 | trace("Values: ", *v, " == ", *input_pint[i]); |
|---|
| | 2127 | assert(*v == *input_pint[i]); |
|---|
| | 2128 | } |
|---|
| | 2129 | |
|---|
| | 2130 | input_struct = &OpaqueStruct(-21, 2.11, "text1"); |
|---|
| | 2131 | output = binserializer.dump(input_struct); |
|---|
| | 2132 | trace(output); |
|---|
| | 2133 | assert(*binserializer.load!(OpaqueStruct*)(output) == *input_struct); |
|---|
| | 2134 | });} |
|---|
| | 2135 | |
|---|
| | 2136 | //------------------------------------------------------------------------------ |
|---|
| | 2137 | |
|---|
| | 2138 | unittest { testCase.execute("load/dump - classes with methods load/dump", { |
|---|
| | 2139 | auto input = new TransparentWithLoadDump; |
|---|
| | 2140 | ubyte[] output; |
|---|
| | 2141 | |
|---|
| | 2142 | input.login = "marcin"; input.password = "gÅŒegŌóÅka"; |
|---|
| | 2143 | output = binserializer.dump(input); |
|---|
| | 2144 | trace(output); |
|---|
| | 2145 | trace(binserializer.load!(TransparentWithLoadDump)(output)); |
|---|
| | 2146 | assert(binserializer.load!(TransparentWithLoadDump)(output) == input); |
|---|
| | 2147 | });} |
|---|
| | 2148 | |
|---|
| | 2149 | //------------------------------------------------------------------------------ |
|---|
| | 2150 | |
|---|
| | 2151 | unittest { testCase.execute("load/dump - non default class constructor", { |
|---|
| | 2152 | NonDefaultConstructor input; |
|---|
| | 2153 | ubyte[] output; |
|---|
| | 2154 | |
|---|
| | 2155 | binserializer.global().typeDescription!(NonDefaultConstructor).ctor = delegate NonDefaultConstructor () { |
|---|
| | 2156 | return new NonDefaultConstructor("Some string", 65); |
|---|
| | 2157 | }; |
|---|
| | 2158 | |
|---|
| | 2159 | input = new NonDefaultConstructor("Some string", 65); |
|---|
| | 2160 | input.a = "Other string"; |
|---|
| | 2161 | input.b = 66; |
|---|
| | 2162 | output = binserializer.dump(input); |
|---|
| | 2163 | assert(binserializer.load!(NonDefaultConstructor)(output) == input); |
|---|
| | 2164 | |
|---|
| | 2165 | //TODO: add also possibility to create structs; currently it's not necessary |
|---|
| | 2166 | //but when structs will have constructors... |
|---|
| | 2167 | });} |
|---|
| | 2168 | |
|---|
| | 2169 | //------------------------------------------------------------------------------ |
|---|
| | 2170 | |
|---|
| | 2171 | unittest { testCase.execute("load/dump - struct/class versioning", { |
|---|
| | 2172 | VersionedClass_v1 input; |
|---|
| | 2173 | ubyte[] output; |
|---|
| | 2174 | |
|---|
| | 2175 | //It is possible to do below; version property defined in below way |
|---|
| | 2176 | //is more important than defined in class itself. |
|---|
| | 2177 | //binserializer.global().typeDescription!(VersionedClass_v1).ver = 1; |
|---|
| | 2178 | |
|---|
| | 2179 | input = new VersionedClass_v1; input.a = "Text"; input.b = 12; |
|---|
| | 2180 | output = binserializer.dump(input); |
|---|
| | 2181 | assert(binserializer.load!(VersionedClass_v1)(output) == input); |
|---|
| | 2182 | |
|---|
| | 2183 | /+ |
|---|
| | 2184 | assert(binserializer.load!(VersionedClass_v1)("[\"Text\", 12]") == input); |
|---|
| | 2185 | assert(checkAssert({ binserializer.load!(VersionedClass_v1)("(0)[\"Text\", 12]");}) ); |
|---|
| | 2186 | assert(binserializer.load!(VersionedClass_v1)("(1)[\"Text\", 12]") == input); |
|---|
| | 2187 | assert(checkException!(Exception)({binserializer.load!(VersionedClass_v1)("(2)[\"Text\", 12]");})); |
|---|
| | 2188 | assert(checkException!(Exception)({binserializer.load!(VersionedClass_v1)("(-1)[\"Text\", 12]");})); |
|---|
| | 2189 | +/ |
|---|
| | 2190 | });} |
|---|
| | 2191 | |
|---|
| | 2192 | //------------------------------------------------------------------------------ |
|---|
| | 2193 | |
|---|
| | 2194 | unittest { testCase.execute("load/dump - versioned struct/class import", { |
|---|
| | 2195 | VersionedClass_v2 input; |
|---|
| | 2196 | ubyte[] output; |
|---|
| | 2197 | |
|---|
| | 2198 | //BUG: doesn't work without () near global: |
|---|
| | 2199 | //binserializer.global().typeDescription!(VersionedClass2).ver = 2; |
|---|
| | 2200 | |
|---|
| | 2201 | input = new VersionedClass_v2; input.a = "Text"; input.b = 12; input.c = "Import"; input.d=true; |
|---|
| | 2202 | output = binserializer.dump(input); |
|---|
| | 2203 | assert(binserializer.load!(VersionedClass_v2)(output) == input); |
|---|
| | 2204 | /+ |
|---|
| | 2205 | assert(checkException!(Exception)({binserializer.load!(VersionedClass_v2)("[\"Text\"]");})); |
|---|
| | 2206 | assert(binserializer.load!(VersionedClass_v2)("(2)[\"Text\", 12, \"Import\", true]") == input); |
|---|
| | 2207 | assert(binserializer.load!(VersionedClass_v2)("(1)[\"Text\", 12]") == input); |
|---|
| | 2208 | +/ |
|---|
| | 2209 | //TODO: dodatkowe testy zachowania siÄ gdy jest zdefniowany globalna wersja |
|---|
| | 2210 | //oraz w klasie - globalna powinna mieÄ pierwszeÅstwo |
|---|
| | 2211 | });} |
|---|
| | 2212 | |
|---|
| | 2213 | //------------------------------------------------------------------------------ |
|---|
| | 2214 | /+ |
|---|
| | 2215 | TODO: Custom loaders/dumpers don't work with binary |
|---|
| | 2216 | unittest { testCase.execute("load/dump - custom loaders/dumpers", { |
|---|
| | 2217 | MyClass input; |
|---|
| | 2218 | ubyte[] output; |
|---|
| | 2219 | |
|---|
| | 2220 | binserializer.global().typeDescription!(MyClass).loader = |
|---|
| | 2221 | delegate bool (ref MyClass value, binserializer.Archive archive) { |
|---|
| | 2222 | value = new MyClass; |
|---|
| | 2223 | |
|---|
| | 2224 | void check(bool res) { |
|---|
| | 2225 | if (!res) throw new Exception("Format for my class is not correct!"); |
|---|
| | 2226 | } |
|---|
| | 2227 | |
|---|
| | 2228 | skip(archive.storage, archive.defSkip.p_skip); |
|---|
| | 2229 | check(archive.traverse(value.x)); |
|---|
| | 2230 | check(skip(archive.storage, "-") != 0); |
|---|
| | 2231 | check(archive.traverse(value.y)); |
|---|
| | 2232 | check(skip(archive.storage, "-") != 0); |
|---|
| | 2233 | check(archive.traverse(value.z)); |
|---|
| | 2234 | |
|---|
| | 2235 | //TODO: rethink visibility of methods; e.g. traverse to Archive?? |
|---|
| | 2236 | return true; |
|---|
| | 2237 | }; |
|---|
| | 2238 | |
|---|
| | 2239 | binserializer.global().typeDescription!(MyClass).dumper = |
|---|
| | 2240 | delegate bool (ref MyClass value, binserializer.Archive archive) { |
|---|
| | 2241 | archive.storage.put(format("%d-%d-%d", value.x, value.y, value.z)); |
|---|
| | 2242 | return true; |
|---|
| | 2243 | }; |
|---|
| | 2244 | |
|---|
| | 2245 | input = new MyClass; input.x = 5; input.y = 10; input.z = 15; |
|---|
| | 2246 | output = binserializer.dump(input); |
|---|
| | 2247 | trace(output); |
|---|
| | 2248 | assert(output == "5-10-15"); |
|---|
| | 2249 | assert(binserializer.load!(MyClass)(output) == input); |
|---|
| | 2250 | });} |
|---|
| | 2251 | +/ |
|---|
| | 2252 | |
|---|
| | 2253 | |
|---|
| | 2254 | |
|---|