import _async_to_generator from "@swc/helpers/src/_async_to_generator.mjs";
import React from 'react';
import { CacheStates } from '../../../../shared/lib/app-router-context';
import { createInitialRouterState } from '../create-initial-router-state';
import { ACTION_RESTORE } from '../router-reducer-types';
import { restoreReducer } from './restore-reducer';
const getInitialRouterStateTree = ()=>[
        '',
        {
            children: [
                'linking',
                {
                    children: [
                        'about',
                        {
                            children: [
                                '',
                                {}
                            ]
                        }
                    ]
                }, 
            ]
        },
        undefined,
        undefined,
        true, 
    ];
function runPromiseThrowChain(fn) {
    return _runPromiseThrowChain.apply(this, arguments);
}
function _runPromiseThrowChain() {
    _runPromiseThrowChain = _async_to_generator(function*(fn) {
        try {
            return yield fn();
        } catch (err) {
            if (err instanceof Promise) {
                yield err;
                return yield runPromiseThrowChain(fn);
            }
            throw err;
        }
    });
    return _runPromiseThrowChain.apply(this, arguments);
}
describe('serverPatchReducer', ()=>{
    it('should apply server patch', _async_to_generator(function*() {
        const initialTree = getInitialRouterStateTree();
        const initialCanonicalUrl = '/linking';
        const children = /*#__PURE__*/ React.createElement("html", null, /*#__PURE__*/ React.createElement("head", null), /*#__PURE__*/ React.createElement("body", null, "Root layout"));
        const initialParallelRoutes = new Map([
            [
                'children',
                new Map([
                    [
                        'linking',
                        {
                            status: CacheStates.READY,
                            parallelRoutes: new Map([
                                [
                                    'children',
                                    new Map([
                                        [
                                            '',
                                            {
                                                status: CacheStates.READY,
                                                data: null,
                                                subTreeData: /*#__PURE__*/ React.createElement(React.Fragment, null, "Linking page"),
                                                parallelRoutes: new Map()
                                            }, 
                                        ], 
                                    ]), 
                                ], 
                            ]),
                            data: null,
                            subTreeData: /*#__PURE__*/ React.createElement(React.Fragment, null, "Linking layout level")
                        }, 
                    ], 
                ]), 
            ], 
        ]);
        const state = createInitialRouterState({
            initialTree,
            initialCanonicalUrl,
            children,
            initialParallelRoutes,
            isServer: false,
            location: new URL('/linking', 'https://localhost')
        });
        const action = {
            type: ACTION_RESTORE,
            url: new URL('/linking/about', 'https://localhost'),
            tree: [
                '',
                {
                    children: [
                        'linking',
                        {
                            children: [
                                'about',
                                {
                                    children: [
                                        '',
                                        {}
                                    ]
                                }, 
                            ]
                        }, 
                    ]
                },
                null,
                null,
                true, 
            ]
        };
        const newState = yield runPromiseThrowChain(()=>restoreReducer(state, action));
        const expectedState = {
            prefetchCache: new Map(),
            pushRef: {
                mpaNavigation: false,
                pendingPush: false
            },
            focusAndScrollRef: {
                apply: false
            },
            canonicalUrl: '/linking/about',
            cache: {
                status: CacheStates.READY,
                data: null,
                subTreeData: /*#__PURE__*/ React.createElement("html", null, /*#__PURE__*/ React.createElement("head", null), /*#__PURE__*/ React.createElement("body", null, "Root layout")),
                parallelRoutes: new Map([
                    [
                        'children',
                        new Map([
                            [
                                'linking',
                                {
                                    status: CacheStates.READY,
                                    parallelRoutes: new Map([
                                        [
                                            'children',
                                            new Map([
                                                [
                                                    '',
                                                    {
                                                        status: CacheStates.READY,
                                                        data: null,
                                                        subTreeData: /*#__PURE__*/ React.createElement(React.Fragment, null, "Linking page"),
                                                        parallelRoutes: new Map()
                                                    }, 
                                                ], 
                                            ]), 
                                        ], 
                                    ]),
                                    data: null,
                                    subTreeData: /*#__PURE__*/ React.createElement(React.Fragment, null, "Linking layout level")
                                }, 
                            ], 
                        ]), 
                    ], 
                ])
            },
            tree: [
                '',
                {
                    children: [
                        'linking',
                        {
                            children: [
                                'about',
                                {
                                    children: [
                                        '',
                                        {}
                                    ]
                                }
                            ]
                        }, 
                    ]
                },
                null,
                null,
                true, 
            ]
        };
        expect(newState).toMatchObject(expectedState);
    }));
    it('should apply server patch (concurrent)', _async_to_generator(function*() {
        const initialTree = getInitialRouterStateTree();
        const initialCanonicalUrl = '/linking';
        const children = /*#__PURE__*/ React.createElement("html", null, /*#__PURE__*/ React.createElement("head", null), /*#__PURE__*/ React.createElement("body", null, "Root layout"));
        const initialParallelRoutes = new Map([
            [
                'children',
                new Map([
                    [
                        'linking',
                        {
                            status: CacheStates.READY,
                            parallelRoutes: new Map([
                                [
                                    'children',
                                    new Map([
                                        [
                                            '',
                                            {
                                                status: CacheStates.READY,
                                                data: null,
                                                subTreeData: /*#__PURE__*/ React.createElement(React.Fragment, null, "Linking page"),
                                                parallelRoutes: new Map()
                                            }, 
                                        ], 
                                    ]), 
                                ], 
                            ]),
                            data: null,
                            subTreeData: /*#__PURE__*/ React.createElement(React.Fragment, null, "Linking layout level")
                        }, 
                    ], 
                ]), 
            ], 
        ]);
        const state = createInitialRouterState({
            initialTree,
            initialCanonicalUrl,
            children,
            initialParallelRoutes,
            isServer: false,
            location: new URL('/linking', 'https://localhost')
        });
        const state2 = createInitialRouterState({
            initialTree,
            initialCanonicalUrl,
            children,
            initialParallelRoutes,
            isServer: false,
            location: new URL('/linking', 'https://localhost')
        });
        const action = {
            type: ACTION_RESTORE,
            url: new URL('/linking/about', 'https://localhost'),
            tree: [
                '',
                {
                    children: [
                        'linking',
                        {
                            children: [
                                'about',
                                {
                                    children: [
                                        '',
                                        {}
                                    ]
                                }, 
                            ]
                        }, 
                    ]
                },
                null,
                null,
                true, 
            ]
        };
        yield runPromiseThrowChain(()=>restoreReducer(state, action));
        const newState = yield runPromiseThrowChain(()=>restoreReducer(state2, action));
        const expectedState = {
            prefetchCache: new Map(),
            pushRef: {
                mpaNavigation: false,
                pendingPush: false
            },
            focusAndScrollRef: {
                apply: false
            },
            canonicalUrl: '/linking/about',
            cache: {
                status: CacheStates.READY,
                data: null,
                subTreeData: /*#__PURE__*/ React.createElement("html", null, /*#__PURE__*/ React.createElement("head", null), /*#__PURE__*/ React.createElement("body", null, "Root layout")),
                parallelRoutes: new Map([
                    [
                        'children',
                        new Map([
                            [
                                'linking',
                                {
                                    status: CacheStates.READY,
                                    parallelRoutes: new Map([
                                        [
                                            'children',
                                            new Map([
                                                [
                                                    '',
                                                    {
                                                        status: CacheStates.READY,
                                                        data: null,
                                                        subTreeData: /*#__PURE__*/ React.createElement(React.Fragment, null, "Linking page"),
                                                        parallelRoutes: new Map()
                                                    }, 
                                                ], 
                                            ]), 
                                        ], 
                                    ]),
                                    data: null,
                                    subTreeData: /*#__PURE__*/ React.createElement(React.Fragment, null, "Linking layout level")
                                }, 
                            ], 
                        ]), 
                    ], 
                ])
            },
            tree: [
                '',
                {
                    children: [
                        'linking',
                        {
                            children: [
                                'about',
                                {
                                    children: [
                                        '',
                                        {}
                                    ]
                                }
                            ]
                        }, 
                    ]
                },
                null,
                null,
                true, 
            ]
        };
        expect(newState).toMatchObject(expectedState);
    }));
});

//# sourceMappingURL=restore-reducer.test.js.map