blob: 7b46fa84b204f15c9491ea254898a2ae6144134e [file] [log] [blame]
// 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 'dart:async';
import 'dart:io' show Platform;
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter_driver/driver_extension.dart';
import 'src/basic_messaging.dart';
import 'src/method_calls.dart';
import 'src/pair.dart';
import 'src/test_step.dart';
void main() {
enableFlutterDriverExtension();
runApp(const TestApp());
}
class TestApp extends StatefulWidget {
const TestApp({super.key});
@override
State<TestApp> createState() => _TestAppState();
}
class _TestAppState extends State<TestApp> {
static final dynamic anUnknownValue = DateTime.fromMillisecondsSinceEpoch(1520777802314);
static final List<dynamic> aList = <dynamic>[
false,
0,
0.0,
'hello',
<dynamic>[
<String, dynamic>{'key': 42},
],
];
static final Map<String, dynamic> aMap = <String, dynamic>{
'a': false,
'b': 0,
'c': 0.0,
'd': 'hello',
'e': <dynamic>[
<String, dynamic>{'key': 42},
],
};
static final Uint8List someUint8s = Uint8List.fromList(<int>[
0xBA,
0x5E,
0xBA,
0x11,
]);
static final Int32List someInt32s = Int32List.fromList(<int>[
-0x7fffffff - 1,
0,
0x7fffffff,
]);
static final Int64List someInt64s = Int64List.fromList(<int>[
-0x7fffffffffffffff - 1,
0,
0x7fffffffffffffff,
]);
static final Float32List someFloat32s = Float32List.fromList(<double>[
double.nan,
double.negativeInfinity,
-double.maxFinite,
-double.minPositive,
-0.0,
0.0,
double.minPositive,
double.maxFinite,
double.infinity,
]);
static final Float64List someFloat64s =
Float64List.fromList(<double>[
double.nan,
double.negativeInfinity,
-double.maxFinite,
-double.minPositive,
-0.0,
0.0,
double.minPositive,
double.maxFinite,
double.infinity,
]);
static final dynamic aCompoundUnknownValue = <dynamic>[
anUnknownValue,
Pair(anUnknownValue, aList),
];
static final List<TestStep> steps = <TestStep>[
() => methodCallJsonSuccessHandshake(null),
() => methodCallJsonSuccessHandshake(true),
() => methodCallJsonSuccessHandshake(7),
() => methodCallJsonSuccessHandshake('world'),
() => methodCallJsonSuccessHandshake(aList),
() => methodCallJsonSuccessHandshake(aMap),
() => methodCallJsonNotImplementedHandshake(),
() => methodCallStandardSuccessHandshake(null),
() => methodCallStandardSuccessHandshake(true),
() => methodCallStandardSuccessHandshake(7),
() => methodCallStandardSuccessHandshake('world'),
() => methodCallStandardSuccessHandshake(aList),
() => methodCallStandardSuccessHandshake(aMap),
() => methodCallStandardSuccessHandshake(anUnknownValue),
() => methodCallStandardSuccessHandshake(aCompoundUnknownValue),
() => methodCallJsonErrorHandshake(null),
() => methodCallJsonErrorHandshake('world'),
() => methodCallStandardErrorHandshake(null),
() => methodCallStandardErrorHandshake('world'),
() => methodCallStandardNotImplementedHandshake(),
() => basicBinaryHandshake(null),
if (!Platform.isMacOS)
// Note, it was decided that this will function differently on macOS. See
// also: https://github.com/flutter/flutter/issues/110865.
() => basicBinaryHandshake(ByteData(0)),
() => basicBinaryHandshake(ByteData(4)..setUint32(0, 0x12345678)),
() => basicStringHandshake('hello, world'),
() => basicStringHandshake('hello \u263A \u{1f602} unicode'),
if (!Platform.isMacOS)
// Note, it was decided that this will function differently on macOS. See
// also: https://github.com/flutter/flutter/issues/110865.
() => basicStringHandshake(''),
() => basicStringHandshake(null),
() => basicJsonHandshake(null),
() => basicJsonHandshake(true),
() => basicJsonHandshake(false),
() => basicJsonHandshake(0),
() => basicJsonHandshake(-7),
() => basicJsonHandshake(7),
() => basicJsonHandshake(1 << 32),
() => basicJsonHandshake(1 << 56),
() => basicJsonHandshake(0.0),
() => basicJsonHandshake(-7.0),
() => basicJsonHandshake(7.0),
() => basicJsonHandshake(''),
() => basicJsonHandshake('hello, world'),
() => basicJsonHandshake('hello, "world"'),
() => basicJsonHandshake('hello \u263A \u{1f602} unicode'),
() => basicJsonHandshake(<dynamic>[]),
() => basicJsonHandshake(aList),
() => basicJsonHandshake(<String, dynamic>{}),
() => basicJsonHandshake(aMap),
() => basicStandardHandshake(null),
() => basicStandardHandshake(true),
() => basicStandardHandshake(false),
() => basicStandardHandshake(0),
() => basicStandardHandshake(-7),
() => basicStandardHandshake(7),
() => basicStandardHandshake(1 << 32),
() => basicStandardHandshake(1 << 64),
() => basicStandardHandshake(1 << 128),
() => basicStandardHandshake(0.0),
() => basicStandardHandshake(-7.0),
() => basicStandardHandshake(7.0),
() => basicStandardHandshake(''),
() => basicStandardHandshake('hello, world'),
() => basicStandardHandshake('hello \u263A \u{1f602} unicode'),
() => basicStandardHandshake(someUint8s),
() => basicStandardHandshake(someInt32s),
() => basicStandardHandshake(someInt64s),
() => basicStandardHandshake(someFloat32s),
() => basicStandardHandshake(someFloat64s),
() => basicStandardHandshake(<dynamic>[]),
() => basicStandardHandshake(aList),
() => basicStandardHandshake(<String, dynamic>{}),
() => basicStandardHandshake(<dynamic, dynamic>{7: true, false: -7}),
() => basicStandardHandshake(aMap),
() => basicStandardHandshake(anUnknownValue),
() => basicStandardHandshake(aCompoundUnknownValue),
() => basicBinaryMessageToUnknownChannel(),
() => basicStringMessageToUnknownChannel(),
() => basicJsonMessageToUnknownChannel(),
() => basicStandardMessageToUnknownChannel(),
if (Platform.isIOS || Platform.isAndroid || Platform.isMacOS)
() => basicBackgroundStandardEcho(123),
];
Future<TestStepResult>? _result;
int _step = 0;
void _executeNextStep() {
setState(() {
if (_step < steps.length) {
_result = steps[_step++]();
} else {
_result = Future<TestStepResult>.value(TestStepResult.complete);
}
});
}
Widget _buildTestResultWidget(
BuildContext context,
AsyncSnapshot<TestStepResult> snapshot,
) {
return TestStepResult.fromSnapshot(snapshot).asWidget(context);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Channels Test',
home: Scaffold(
appBar: AppBar(
title: const Text('Channels Test'),
),
body: Padding(
padding: const EdgeInsets.all(20.0),
child: FutureBuilder<TestStepResult>(
future: _result,
builder: _buildTestResultWidget,
),
),
floatingActionButton: FloatingActionButton(
key: const ValueKey<String>('step'),
onPressed: _executeNextStep,
child: const Icon(Icons.navigate_next),
),
),
);
}
}