@@ -1890,7 +1890,7 @@ describe('Element', function () {
18901890 before ( function ( ) {
18911891 element . insertPlaceholder ( ) ;
18921892 } ) ;
1893- it ( 'array has one element' , function ( ) {
1893+ it ( 'array has one empty string element' , function ( ) {
18941894 expect ( element . at ( 0 ) ?. currentKey ) . to . equal ( 0 ) ;
18951895 expect ( element . at ( 0 ) ?. value ) . to . equal ( '' ) ;
18961896 expect ( element . elements ?. size ) . to . equal ( 1 ) ;
@@ -1922,6 +1922,89 @@ describe('Element', function () {
19221922 }
19231923 } ) ;
19241924 } ) ;
1925+ context ( 'into a number array' , function ( ) {
1926+ const doc = new Document ( { } ) ;
1927+ const element = new Element ( 'emails' , [ 25 , 123 ] , doc ) ;
1928+ before ( function ( ) {
1929+ element . insertPlaceholder ( ) ;
1930+ } ) ;
1931+ it ( 'inserts a number type element into the end' , function ( ) {
1932+ expect ( element . at ( 2 ) ?. value ) . to . deep . equal ( new Int32 ( 0 ) ) ;
1933+ } ) ;
1934+ } ) ;
1935+ context ( 'into a date array' , function ( ) {
1936+ const doc = new Document ( { } ) ;
1937+ const element = new Element ( 'emails' , [ new Date ( ) , new Date ( ) ] , doc ) ;
1938+ before ( function ( ) {
1939+ element . insertPlaceholder ( ) ;
1940+ } ) ;
1941+ it ( 'inserts a date type element into the end' , function ( ) {
1942+ expect ( element . at ( 2 ) ?. value ?. toString ( ) ) . to . equal (
1943+ new Date ( 0 ) . toString ( )
1944+ ) ;
1945+ expect ( element . at ( 2 ) ?. value ) . to . deep . equal ( new Date ( 0 ) ) ;
1946+ } ) ;
1947+ } ) ;
1948+ context ( 'into an array of arrays' , function ( ) {
1949+ const doc = new Document ( { } ) ;
1950+ const element = new Element (
1951+ 'emails' ,
1952+ [
1953+ [ 'a' , 'b' ] ,
1954+ [ 'c' , 'd' ] ,
1955+ ] ,
1956+ doc
1957+ ) ;
1958+ before ( function ( ) {
1959+ element . insertPlaceholder ( ) ;
1960+ } ) ;
1961+ it ( 'inserts an array type element into the end' , function ( ) {
1962+ expect ( element . elements ?. size ) . to . equal ( 3 ) ;
1963+ expect ( element . elements ?. at ( 1 ) ?. elements ?. at ( 0 ) ?. value ) . to . equal ( 'c' ) ;
1964+ expect ( element . elements ?. at ( 2 ) ?. currentType ) . to . equal ( 'Array' ) ;
1965+ expect ( element . elements ?. at ( 2 ) ?. elements ?. size ) . to . equal ( 0 ) ;
1966+ expect ( element . generateObject ( ) ) . to . deep . equal ( [
1967+ [ 'a' , 'b' ] ,
1968+ [ 'c' , 'd' ] ,
1969+ [ ] ,
1970+ ] ) ;
1971+ } ) ;
1972+ } ) ;
1973+ context ( 'into an array of objects' , function ( ) {
1974+ const doc = new Document ( { } ) ;
1975+ const element = new Element (
1976+ 'fruits' ,
1977+ [
1978+ {
1979+ name : 'pineapple' ,
1980+ } ,
1981+ {
1982+ name : 'orange' ,
1983+ } ,
1984+ ] ,
1985+ doc
1986+ ) ;
1987+ before ( function ( ) {
1988+ element . insertPlaceholder ( ) ;
1989+ } ) ;
1990+ it ( 'inserts an object type element into the end' , function ( ) {
1991+ expect ( element . elements ?. size ) . to . equal ( 3 ) ;
1992+ expect (
1993+ element . elements ?. at ( 1 ) ?. elements ?. get ( 'name' ) ?. value
1994+ ) . to . equal ( 'orange' ) ;
1995+ expect ( element . elements ?. at ( 2 ) ?. currentType ) . to . equal ( 'Object' ) ;
1996+ expect ( element . elements ?. at ( 2 ) ?. elements ?. size ) . to . equal ( 0 ) ;
1997+ expect ( element . generateObject ( ) ) . to . deep . equal ( [
1998+ {
1999+ name : 'pineapple' ,
2000+ } ,
2001+ {
2002+ name : 'orange' ,
2003+ } ,
2004+ { } ,
2005+ ] ) ;
2006+ } ) ;
2007+ } ) ;
19252008 context ( 'insert after placeholders' , function ( ) {
19262009 context ( 'insertAfter' , function ( ) {
19272010 context ( 'with only placeholders' , function ( ) {
@@ -2040,6 +2123,129 @@ describe('Element', function () {
20402123 } ) ;
20412124 } ) ;
20422125
2126+ describe ( '#insertSiblingPlaceholder' , function ( ) {
2127+ context ( 'into an empty array' , function ( ) {
2128+ const doc = new Document ( { } ) ;
2129+ const element = new Element ( 'emails' , [ ] , doc ) ;
2130+ before ( function ( ) {
2131+ element . insertPlaceholder ( ) ;
2132+ element . at ( 0 ) ?. insertSiblingPlaceholder ( ) ;
2133+ } ) ;
2134+ it ( 'array has two empty string element' , function ( ) {
2135+ expect ( element . at ( 0 ) ?. currentKey ) . to . equal ( 0 ) ;
2136+ expect ( element . at ( 0 ) ?. value ) . to . equal ( '' ) ;
2137+ expect ( element . at ( 1 ) ?. currentKey ) . to . equal ( 1 ) ;
2138+ expect ( element . at ( 1 ) ?. value ) . to . equal ( '' ) ;
2139+ expect ( element . elements ?. size ) . to . equal ( 2 ) ;
2140+ } ) ;
2141+ it ( 'element is modified' , function ( ) {
2142+ expect ( element . at ( 0 ) ?. isModified ( ) ) . to . equal ( true ) ;
2143+ expect ( element . at ( 1 ) ?. isModified ( ) ) . to . equal ( true ) ;
2144+ } ) ;
2145+ } ) ;
2146+ context ( 'into a full array' , function ( ) {
2147+ const doc = new Document ( { } ) ;
2148+ const element = new Element ( 'emails' , [ 'item0' , 'item1' , 'item2' ] , doc ) ;
2149+ before ( function ( ) {
2150+ element . at ( 2 ) ?. insertSiblingPlaceholder ( ) ;
2151+ } ) ;
2152+ it ( 'inserts the element into the end' , function ( ) {
2153+ expect ( element . at ( 3 ) ?. currentKey ) . to . equal ( 3 ) ;
2154+ expect ( element . at ( 3 ) ?. value ) . to . equal ( '' ) ;
2155+ } ) ;
2156+ it ( 'keeps the other elements the same' , function ( ) {
2157+ expect ( element . elements ?. size ) . to . equal ( 4 ) ;
2158+ for ( let i = 0 ; i < 3 ; i ++ ) {
2159+ expect ( element . at ( i ) ?. currentKey ) . to . equal ( i ) ;
2160+ expect ( element . at ( i ) ?. value ) . to . equal ( `item${ i } ` ) ;
2161+ }
2162+ } ) ;
2163+ it ( 'element is modified' , function ( ) {
2164+ for ( let i = 0 ; i < 4 ; i ++ ) {
2165+ expect ( element . at ( i ) ?. isModified ( ) ) . to . equal ( i === 3 ) ;
2166+ }
2167+ } ) ;
2168+ } ) ;
2169+ context ( 'into a number array' , function ( ) {
2170+ const doc = new Document ( { } ) ;
2171+ const element = new Element ( 'emails' , [ 25 , 123 ] , doc ) ;
2172+ before ( function ( ) {
2173+ element . at ( 1 ) ?. insertSiblingPlaceholder ( ) ;
2174+ } ) ;
2175+ it ( 'inserts a number type element into the end' , function ( ) {
2176+ expect ( element . at ( 2 ) ?. value ) . to . deep . equal ( new Int32 ( 0 ) ) ;
2177+ } ) ;
2178+ } ) ;
2179+ context ( 'into a date array' , function ( ) {
2180+ const doc = new Document ( { } ) ;
2181+ const element = new Element ( 'emails' , [ new Date ( ) , new Date ( ) ] , doc ) ;
2182+ before ( function ( ) {
2183+ element . at ( 1 ) ?. insertSiblingPlaceholder ( ) ;
2184+ } ) ;
2185+ it ( 'inserts a date type element into the end' , function ( ) {
2186+ expect ( element . at ( 2 ) ?. value ) . to . deep . equal ( new Date ( 0 ) ) ;
2187+ } ) ;
2188+ } ) ;
2189+ context ( 'into an array of arrays' , function ( ) {
2190+ const doc = new Document ( { } ) ;
2191+ const element = new Element (
2192+ 'emails' ,
2193+ [
2194+ [ 1 , 2 ] ,
2195+ [ 3 , 4 ] ,
2196+ ] ,
2197+ doc
2198+ ) ;
2199+ before ( function ( ) {
2200+ element . at ( 1 ) ?. insertSiblingPlaceholder ( ) ;
2201+ } ) ;
2202+ it ( 'inserts an array type element into the end' , function ( ) {
2203+ expect ( element . elements ?. size ) . to . equal ( 3 ) ;
2204+ expect ( element . elements ?. at ( 1 ) ?. elements ?. at ( 0 ) ?. value ) . to . deep . equal (
2205+ new Int32 ( 3 )
2206+ ) ;
2207+ expect ( element . elements ?. at ( 2 ) ?. currentType ) . to . equal ( 'Array' ) ;
2208+ expect ( element . elements ?. at ( 2 ) ?. elements ?. size ) . to . equal ( 0 ) ;
2209+ expect ( element . elements ?. at ( 2 ) ?. generateObject ( ) ) . to . deep . equal ( [ ] ) ;
2210+ } ) ;
2211+ context ( 'into an array of objects' , function ( ) {
2212+ const doc = new Document ( { } ) ;
2213+ const element = new Element (
2214+ 'fruits' ,
2215+ [
2216+ {
2217+ name : 'pineapple' ,
2218+ } ,
2219+ {
2220+ name : 'orange' ,
2221+ } ,
2222+ ] ,
2223+ doc
2224+ ) ;
2225+ before ( function ( ) {
2226+ element . at ( 1 ) ?. insertSiblingPlaceholder ( ) ;
2227+ } ) ;
2228+ it ( 'inserts an object type element into the end' , function ( ) {
2229+ expect ( element . elements ?. size ) . to . equal ( 3 ) ;
2230+ expect (
2231+ element . elements ?. at ( 1 ) ?. elements ?. get ( 'name' ) ?. value
2232+ ) . to . equal ( 'orange' ) ;
2233+ expect ( element . elements ?. at ( 2 ) ?. currentType ) . to . equal ( 'Object' ) ;
2234+ expect ( element . elements ?. at ( 2 ) ?. elements ?. size ) . to . equal ( 0 ) ;
2235+ expect ( element . generateObject ( ) ) . to . deep . equal ( [
2236+ {
2237+ name : 'pineapple' ,
2238+ } ,
2239+ {
2240+ name : 'orange' ,
2241+ } ,
2242+ { } ,
2243+ ] ) ;
2244+ } ) ;
2245+ } ) ;
2246+ } ) ;
2247+ } ) ;
2248+
20432249 describe ( '#remove' , function ( ) {
20442250 context ( 'element to be removed is top-level' , function ( ) {
20452251 context ( 'and is added' , function ( ) {
0 commit comments