// Copyright 2014 The Flutter Authors. All rights reserved.
// 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_driver/driver_extension.dart';

void main() {
  enableFlutterDriverExtension();
  runApp(const DriverTestApp());
}

class DriverTestApp extends StatefulWidget {
  const DriverTestApp({Key? key}) : super(key: key);

  @override
  State<StatefulWidget> createState() {
    return DriverTestAppState();
  }
}

class DriverTestAppState extends State<DriverTestApp> {
  bool present = true;
  Letter _selectedValue = Letter.a;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('FlutterDriver test'),
        ),
        body: ListView(
          padding: const EdgeInsets.all(5.0),
          children: <Widget>[
            Row(
              children: <Widget>[
                Expanded(
                  child: Text(present ? 'present' : 'absent'),
                ),
                ElevatedButton(
                  child: const Text(
                    'toggle',
                    key: ValueKey<String>('togglePresent'),
                  ),
                  onPressed: () {
                    setState(() {
                      present = !present;
                    });
                  },
                ),
              ],
            ),
            Row(
              children: <Widget>[
                const Expanded(
                  child: Text('hit testability'),
                ),
                DropdownButton<Letter>(
                  key: const ValueKey<String>('dropdown'),
                  value: _selectedValue,
                  onChanged: (Letter? newValue) {
                    setState(() {
                      _selectedValue = newValue!;
                    });
                  },
                  items: const <DropdownMenuItem<Letter>>[
                    DropdownMenuItem<Letter>(
                      value: Letter.a,
                      child: Text('Aaa', key: ValueKey<String>('a')),
                    ),
                    DropdownMenuItem<Letter>(
                      value: Letter.b,
                      child: Text('Bbb', key: ValueKey<String>('b')),
                    ),
                    DropdownMenuItem<Letter>(
                      value: Letter.c,
                      child: Text('Ccc', key: ValueKey<String>('c')),
                    ),
                  ],
                ),
              ],
            ),
            const TextField(
              key: ValueKey<String>('enter-text-field'),
            ),
          ],
        ),
      ),
    );
  }
}

enum Letter { a, b, c }
