mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

The (new, not yet used) code gen for iOS was setting up a std::map from key codes to logical and physical key codes, but it was using uint32_t, which isn't big enough to hold the Flutter key codes. Also, iOS needs to be able to filter out function keys, so I added a function key set.
192 lines
7.4 KiB
Dart
192 lines
7.4 KiB
Dart
// 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:convert';
|
|
import 'dart:io';
|
|
|
|
import 'package:gen_keycodes/android_code_gen.dart';
|
|
import 'package:gen_keycodes/base_code_gen.dart';
|
|
import 'package:gen_keycodes/gtk_code_gen.dart';
|
|
import 'package:gen_keycodes/ios_code_gen.dart';
|
|
import 'package:gen_keycodes/logical_key_data.dart';
|
|
import 'package:gen_keycodes/macos_code_gen.dart';
|
|
import 'package:gen_keycodes/physical_key_data.dart';
|
|
import 'package:gen_keycodes/utils.dart';
|
|
import 'package:gen_keycodes/web_code_gen.dart';
|
|
import 'package:gen_keycodes/windows_code_gen.dart';
|
|
import 'package:path/path.dart' as path;
|
|
import 'package:test/test.dart' hide TypeMatcher, isInstanceOf;
|
|
|
|
String readDataFile(String fileName) {
|
|
return File(path.join(dataRoot, fileName)).readAsStringSync();
|
|
}
|
|
|
|
final String testPhysicalData = path.join(dataRoot, 'physical_key_data.json');
|
|
final String testLogicalData = path.join(dataRoot,'logical_key_data.json');
|
|
|
|
void main() {
|
|
setUp(() {
|
|
testDataRoot = path.canonicalize(path.join(Directory.current.absolute.path, 'data'));
|
|
});
|
|
|
|
tearDown((){
|
|
testDataRoot = null;
|
|
});
|
|
|
|
void checkCommonOutput(String output) {
|
|
expect(output, contains(RegExp('Copyright 201[34]')));
|
|
expect(output, contains('DO NOT EDIT'));
|
|
expect(output, contains(RegExp(r'\b[kK]eyA\b')));
|
|
expect(output, contains(RegExp(r'\b[Dd]igit1\b')));
|
|
expect(output, contains(RegExp(r'\b[Ff]1\b')));
|
|
expect(output, contains(RegExp(r'\b[Nn]umpad1\b')));
|
|
expect(output, contains(RegExp(r'\b[Ss]hiftLeft\b')));
|
|
}
|
|
|
|
test('Generate Keycodes for Android', () {
|
|
PhysicalKeyData physicalData;
|
|
LogicalKeyData logicalData;
|
|
|
|
physicalData = PhysicalKeyData.fromJson(
|
|
json.decode(File(testPhysicalData).readAsStringSync()) as Map<String, dynamic>);
|
|
logicalData = LogicalKeyData.fromJson(
|
|
json.decode(File(testLogicalData).readAsStringSync()) as Map<String, dynamic>);
|
|
|
|
const String platform = 'android';
|
|
final PlatformCodeGenerator codeGenerator = AndroidCodeGenerator(
|
|
physicalData,
|
|
logicalData,
|
|
);
|
|
final String output = codeGenerator.generate();
|
|
|
|
expect(codeGenerator.outputPath(platform), endsWith('KeyboardMap.java'));
|
|
expect(output, contains('class KeyboardMap'));
|
|
expect(output, contains('scanCodeToPhysical'));
|
|
expect(output, contains('keyCodeToLogical'));
|
|
checkCommonOutput(output);
|
|
});
|
|
test('Generate Keycodes for macOS', () {
|
|
PhysicalKeyData physicalData;
|
|
LogicalKeyData logicalData;
|
|
|
|
physicalData = PhysicalKeyData.fromJson(
|
|
json.decode(File(testPhysicalData).readAsStringSync()) as Map<String, dynamic>);
|
|
logicalData = LogicalKeyData.fromJson(
|
|
json.decode(File(testLogicalData).readAsStringSync()) as Map<String, dynamic>);
|
|
|
|
const String platform = 'macos';
|
|
final PlatformCodeGenerator codeGenerator = MacOSCodeGenerator(
|
|
physicalData,
|
|
logicalData,
|
|
);
|
|
final String output = codeGenerator.generate();
|
|
|
|
expect(codeGenerator.outputPath(platform), endsWith('KeyCodeMap.mm'));
|
|
expect(output, contains('kValueMask'));
|
|
expect(output, contains('keyCodeToPhysicalKey'));
|
|
expect(output, contains('keyCodeToLogicalKey'));
|
|
expect(output, contains('keyCodeToModifierFlag'));
|
|
expect(output, contains('modifierFlagToKeyCode'));
|
|
expect(output, contains('kCapsLockPhysicalKey'));
|
|
expect(output, contains('kCapsLockLogicalKey'));
|
|
checkCommonOutput(output);
|
|
});
|
|
test('Generate Keycodes for iOS', () {
|
|
PhysicalKeyData physicalData;
|
|
LogicalKeyData logicalData;
|
|
|
|
physicalData = PhysicalKeyData.fromJson(
|
|
json.decode(File(testPhysicalData).readAsStringSync()) as Map<String, dynamic>);
|
|
logicalData = LogicalKeyData.fromJson(
|
|
json.decode(File(testLogicalData).readAsStringSync()) as Map<String, dynamic>);
|
|
|
|
const String platform = 'ios';
|
|
final PlatformCodeGenerator codeGenerator = IOSCodeGenerator(
|
|
physicalData,
|
|
logicalData,
|
|
);
|
|
final String output = codeGenerator.generate();
|
|
|
|
expect(codeGenerator.outputPath(platform), endsWith('KeyCodeMap.mm'));
|
|
expect(output, contains('kValueMask'));
|
|
expect(output, contains('keyCodeToPhysicalKey'));
|
|
expect(output, contains('keyCodeToLogicalKey'));
|
|
expect(output, contains('keyCodeToModifierFlag'));
|
|
expect(output, contains('modifierFlagToKeyCode'));
|
|
expect(output, contains('functionKeyCodes'));
|
|
expect(output, contains('kCapsLockPhysicalKey'));
|
|
expect(output, contains('kCapsLockLogicalKey'));
|
|
checkCommonOutput(output);
|
|
});
|
|
test('Generate Keycodes for Windows', () {
|
|
PhysicalKeyData physicalData;
|
|
LogicalKeyData logicalData;
|
|
|
|
physicalData = PhysicalKeyData.fromJson(
|
|
json.decode(File(testPhysicalData).readAsStringSync()) as Map<String, dynamic>);
|
|
logicalData = LogicalKeyData.fromJson(
|
|
json.decode(File(testLogicalData).readAsStringSync()) as Map<String, dynamic>);
|
|
|
|
const String platform = 'windows';
|
|
final PlatformCodeGenerator codeGenerator = WindowsCodeGenerator(
|
|
physicalData,
|
|
logicalData,
|
|
readDataFile(path.join(dataRoot, 'windows_scancode_logical_map.json')),
|
|
);
|
|
final String output = codeGenerator.generate();
|
|
|
|
expect(codeGenerator.outputPath(platform), endsWith('flutter_key_map.cc'));
|
|
expect(output, contains('KeyboardKeyEmbedderHandler::windowsToPhysicalMap_'));
|
|
expect(output, contains('KeyboardKeyEmbedderHandler::windowsToLogicalMap_'));
|
|
expect(output, contains('KeyboardKeyEmbedderHandler::scanCodeToLogicalMap_'));
|
|
checkCommonOutput(output);
|
|
});
|
|
test('Generate Keycodes for Linux', () {
|
|
PhysicalKeyData physicalData;
|
|
LogicalKeyData logicalData;
|
|
|
|
physicalData = PhysicalKeyData.fromJson(
|
|
json.decode(File(testPhysicalData).readAsStringSync()) as Map<String, dynamic>);
|
|
logicalData = LogicalKeyData.fromJson(
|
|
json.decode(File(testLogicalData).readAsStringSync()) as Map<String, dynamic>);
|
|
|
|
const String platform = 'gtk';
|
|
final PlatformCodeGenerator codeGenerator = GtkCodeGenerator(
|
|
physicalData,
|
|
logicalData,
|
|
readDataFile(path.join(dataRoot, 'gtk_modifier_bit_mapping.json')),
|
|
readDataFile(path.join(dataRoot, 'gtk_lock_bit_mapping.json')),
|
|
);
|
|
final String output = codeGenerator.generate();
|
|
|
|
expect(codeGenerator.outputPath(platform), endsWith('key_mapping.cc'));
|
|
expect(output, contains('initialize_modifier_bit_to_checked_keys'));
|
|
expect(output, contains('initialize_lock_bit_to_checked_keys'));
|
|
checkCommonOutput(output);
|
|
});
|
|
test('Generate Keycodes for Web', () {
|
|
PhysicalKeyData physicalData;
|
|
LogicalKeyData logicalData;
|
|
|
|
physicalData = PhysicalKeyData.fromJson(
|
|
json.decode(File(testPhysicalData).readAsStringSync()) as Map<String, dynamic>);
|
|
logicalData = LogicalKeyData.fromJson(
|
|
json.decode(File(testLogicalData).readAsStringSync()) as Map<String, dynamic>);
|
|
|
|
const String platform = 'web';
|
|
final PlatformCodeGenerator codeGenerator = WebCodeGenerator(
|
|
physicalData,
|
|
logicalData,
|
|
readDataFile(path.join(dataRoot, 'web_logical_location_mapping.json')),
|
|
);
|
|
final String output = codeGenerator.generate();
|
|
|
|
expect(codeGenerator.outputPath(platform), endsWith('key_map.dart'));
|
|
expect(output, contains('kWebToLogicalKey'));
|
|
expect(output, contains('kWebToPhysicalKey'));
|
|
expect(output, contains('kWebLogicalLocationMap'));
|
|
checkCommonOutput(output);
|
|
});
|
|
}
|