// Copyright 2013 The Flutter Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:go_router/go_router.dart';

void main() {
  group('replaceNamed', () {
    Future<GoRouter> createGoRouter(
      WidgetTester tester, {
      Listenable? refreshListenable,
    }) async {
      final router = GoRouter(
        initialLocation: '/',
        routes: <GoRoute>[
          GoRoute(
            path: '/',
            name: 'home',
            builder: (_, __) => const _MyWidget(),
          ),
          GoRoute(
            path: '/page-0/:tab',
            name: 'page-0',
            builder: (_, __) => const SizedBox(),
          ),
        ],
      );
      addTearDown(router.dispose);
      await tester.pumpWidget(MaterialApp.router(routerConfig: router));
      return router;
    }

    testWidgets('Passes GoRouter parameters through context call.', (
      WidgetTester tester,
    ) async {
      final GoRouter router = await createGoRouter(tester);
      await tester.tap(find.text('Settings'));
      await tester.pumpAndSettle();
      expect(
        router.routerDelegate.currentConfiguration.uri.toString(),
        '/page-0/settings?search=notification',
      );
    });
  });
}

class _MyWidget extends StatelessWidget {
  const _MyWidget();

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () => context.replaceNamed(
        'page-0',
        pathParameters: <String, String>{'tab': 'settings'},
        queryParameters: <String, String>{'search': 'notification'},
      ),
      child: const Text('Settings'),
    );
  }
}