├── release_notes.txt ├── ios ├── Flutter │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── AppFrameworkInfo.plist ├── Runner │ ├── Runner-Bridging-Header.h │ ├── Assets.xcassets │ │ ├── LaunchImage.imageset │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ ├── README.md │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-83.5x83.5@2x.png │ │ │ └── Contents.json │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard │ └── Info.plist ├── Runner.xcworkspace │ └── contents.xcworkspacedata ├── Runner.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ └── project.pbxproj └── .gitignore ├── android ├── gradle.properties ├── .gitignore ├── app │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── values │ │ │ │ │ └── styles.xml │ │ │ │ └── drawable │ │ │ │ │ └── launch_background.xml │ │ │ ├── kotlin │ │ │ │ └── br │ │ │ │ │ └── com │ │ │ │ │ └── chinnonsantos │ │ │ │ │ └── full_testing_flutter │ │ │ │ │ └── MainActivity.kt │ │ │ └── AndroidManifest.xml │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ └── profile │ │ │ └── AndroidManifest.xml │ └── build.gradle ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── settings.gradle └── build.gradle ├── .codecov.yml ├── scripts └── flutter_test.sh ├── .metadata ├── test_driver ├── app.dart └── app_test.dart ├── coverage └── lcov.info ├── lib ├── counter.dart └── main.dart ├── SECURITY.md ├── .gitignore ├── analysis_options.yaml ├── .travis.yml ├── pubspec.yaml ├── LICENSE ├── test ├── unit │ ├── counter_test.dart │ └── provider_test.dart └── widget │ └── widget_test.dart ├── sylph.yaml ├── .github └── workflows │ └── detekt-analysis.yml ├── README.md └── pubspec.lock /release_notes.txt: -------------------------------------------------------------------------------- 1 | First release version 1.0.0 -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.enableR8=true 3 | android.useAndroidX=true 4 | android.enableJetifier=true 5 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chinnonsantos/full_testing_flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /.codecov.yml: -------------------------------------------------------------------------------- 1 | codecov: 2 | require_ci_to_pass: yes 3 | 4 | coverage: 5 | precision: 2 6 | round: down 7 | range: "70...100" 8 | 9 | status: 10 | project: yes 11 | patch: yes 12 | changes: no 13 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /scripts/flutter_test.sh: -------------------------------------------------------------------------------- 1 | set -e # abort CI if an error happens 2 | flutter packages get 3 | flutter format --set-exit-if-changed lib test test_driver 4 | flutter analyze --no-current-package lib test/ 5 | flutter test --no-pub --coverage 6 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip 7 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 856a90e67c9284124d44d2be6c785bacd3a1c772 8 | channel: beta 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /test_driver/app.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_driver/driver_extension.dart'; 2 | import 'package:full_testing_flutter/main.dart' as app; 3 | 4 | void main() { 5 | // This line enables the extension. 6 | enableFlutterDriverExtension(); 7 | 8 | // Call the `main()` function of the app, or call `runApp` with 9 | // any widget you are interested in testing. 10 | app.main(); 11 | } 12 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/br/com/chinnonsantos/full_testing_flutter/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package br.com.chinnonsantos.full_testing_flutter 2 | 3 | import android.os.Bundle 4 | import io.flutter.app.FlutterActivity 5 | import io.flutter.plugins.GeneratedPluginRegistrant 6 | 7 | class MainActivity: FlutterActivity() { 8 | override fun onCreate(savedInstanceState: Bundle?) { 9 | super.onCreate(savedInstanceState) 10 | GeneratedPluginRegistrant.registerWith(this) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /coverage/lcov.info: -------------------------------------------------------------------------------- 1 | SF:lib/counter.dart 2 | DA:10,3 3 | DA:11,6 4 | DA:13,3 5 | DA:16,2 6 | DA:17,4 7 | DA:19,2 8 | LF:6 9 | LH:6 10 | end_of_record 11 | SF:lib/main.dart 12 | DA:5,0 13 | DA:9,2 14 | DA:17,2 15 | DA:21,4 16 | DA:22,2 17 | DA:24,2 18 | DA:27,2 19 | DA:36,2 20 | DA:38,2 21 | DA:40,2 22 | DA:41,2 23 | DA:42,4 24 | DA:44,2 25 | DA:45,2 26 | DA:47,2 27 | DA:48,2 28 | DA:55,2 29 | DA:56,4 30 | DA:57,4 31 | DA:58,2 32 | DA:59,6 33 | DA:65,2 34 | DA:75,2 35 | DA:76,1 36 | DA:77,2 37 | DA:79,2 38 | LF:26 39 | LH:25 40 | end_of_record 41 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/counter.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/foundation.dart'; 2 | 3 | /// Simplest possible model, with just one field. 4 | /// 5 | /// [ChangeNotifier] is a class in `flutter:foundation`. 6 | /// [Counter] does _not_ depend on Provider. 7 | class Counter with ChangeNotifier { 8 | int value = 0; 9 | 10 | void increment() { 11 | value++; 12 | // print('Value++: $value'); 13 | notifyListeners(); 14 | } 15 | 16 | void decrement() { 17 | value--; 18 | // print('Value--: $value'); 19 | notifyListeners(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() 4 | 5 | def plugins = new Properties() 6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') 7 | if (pluginsFile.exists()) { 8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } 9 | } 10 | 11 | plugins.each { name, path -> 12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() 13 | include ":$name" 14 | project(":$name").projectDir = pluginDirectory 15 | } 16 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy (WIP) 2 | 3 | ## Supported Versions 4 | 5 | Use this section to tell people about which versions of your project are 6 | currently being supported with security updates. 7 | 8 | | Version | Supported | 9 | | ------- | ------------------ | 10 | | 5.1.x | :white_check_mark: | 11 | | 5.0.x | :x: | 12 | | 4.0.x | :white_check_mark: | 13 | | < 4.0 | :x: | 14 | 15 | ## Reporting a Vulnerability 16 | 17 | Use this section to tell people how to report a vulnerability. 18 | 19 | Tell them where to go, how often they can expect to get an update on a 20 | reported vulnerability, what to expect if the vulnerability is accepted or 21 | declined, etc. 22 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.50' 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:3.5.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | jcenter() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | .dart_tool/ 26 | .flutter-plugins 27 | .packages 28 | .pub-cache/ 29 | .pub/ 30 | /build/ 31 | 32 | # Web related 33 | lib/generated_plugin_registrant.dart 34 | 35 | # Exceptions to above rules. 36 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 37 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file 2 | # for details. All rights reserved. Use of this source code is governed by a 3 | # BSD-style license that can be found in the LICENSE file. 4 | # 5 | # Google internally enforced rules. See README.md for more information, 6 | # including a list of lints that are intentionally _not_ enforced. 7 | # 8 | # Include this file if you want to always use the latest version. If your 9 | # continuous build and/or presubmit check lints then they will likely fail 10 | # whenever a new version of `package:pedantic` is released. To avoid this, 11 | # specify a specific version of `analysis_options.yaml` instead. 12 | 13 | include: package:pedantic/analysis_options.1.8.0.yaml -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: shell 2 | os: 3 | - linux 4 | - osx 5 | env: 6 | - FLUTTER_CHANNEL="stable" 7 | - FLUTTER_CHANNEL="beta" 8 | before_script: 9 | - cd .. 10 | - git clone https://github.com/flutter/flutter.git -b $FLUTTER_CHANNEL 11 | - export PATH=$PATH:$PWD/flutter/bin:$PWD/flutter/bin/cache/dart-sdk/bin 12 | - cd - 13 | - flutter doctor 14 | - chmod +x scripts/flutter_test.sh 15 | script: 16 | - set -e # abort CI if an error happens 17 | - ./scripts/flutter_test.sh 18 | 19 | # export coverage 20 | - if [ $FLUTTER_CHANNEL = "beta" ]; then 21 | bash <(curl -s https://codecov.io/bash); 22 | fi 23 | jobs: 24 | allow_failures: 25 | - env: FLUTTER_CHANNEL="stable" 26 | - os: osx 27 | cache: 28 | directories: 29 | - $HOME/.pub-cache 30 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: full_testing_flutter 2 | description: Flutter App's simplest automated full test. 3 | version: 1.0.0 4 | author: Chinnon Santos 5 | homepage: https://www.chinnonsantos.com.br 6 | repository: https://github.com/chinnonsantos/full_testing_flutter 7 | issue_tracker: https://github.com/chinnonsantos/full_testing_flutter/issues 8 | 9 | environment: 10 | sdk: ">=2.1.0 <3.0.0" 11 | 12 | dependencies: 13 | flutter: 14 | sdk: flutter 15 | cupertino_icons: ^0.1.3 16 | # https://pub.dev/packages/test 17 | test: ^1.9.4 18 | # https://pub.dev/packages/provider 19 | provider: ^3.2.0 20 | 21 | dev_dependencies: 22 | flutter_test: 23 | sdk: flutter 24 | flutter_driver: 25 | sdk: flutter 26 | # https://pub.dev/packages/pedantic 27 | pedantic: ^1.8.0+1 28 | 29 | flutter: 30 | uses-material-design: true 31 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Chinnon Santos 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /test/unit/counter_test.dart: -------------------------------------------------------------------------------- 1 | // Import the test package and Counter class 2 | import 'package:test/test.dart'; 3 | import 'package:full_testing_flutter/counter.dart'; 4 | 5 | void main() { 6 | group('[Counter]', () { 7 | Counter _counter; 8 | 9 | setUp(() { 10 | _counter = Counter(); 11 | }); 12 | 13 | test('Counter initial value should be 0', () { 14 | expect(_counter.value, 0); 15 | }); 16 | 17 | test('Counter class type should be `Counter`', () { 18 | expect(_counter.runtimeType, equals(Counter)); 19 | }); 20 | 21 | test('Counter value type should be `int`', () { 22 | expect(_counter.value.runtimeType, equals(int)); 23 | }); 24 | 25 | test('Counter value should not be `null`', () { 26 | expect(_counter.value, isNotNull); 27 | }); 28 | 29 | test('Counter value should be incremented', () { 30 | _counter.increment(); 31 | 32 | expect(_counter.value, 1); 33 | }); 34 | 35 | test('Counter value should be decremented', () { 36 | _counter.decrement(); 37 | 38 | expect(_counter.value, -1); 39 | }); 40 | 41 | test('Counter value should be first incremented and then decremented', () { 42 | _counter.increment(); 43 | _counter.decrement(); 44 | 45 | expect(_counter.value, 0); 46 | }); 47 | }); 48 | } 49 | -------------------------------------------------------------------------------- /test_driver/app_test.dart: -------------------------------------------------------------------------------- 1 | // Imports the Flutter Driver API. 2 | import 'package:flutter_driver/flutter_driver.dart'; 3 | import 'package:test/test.dart'; 4 | 5 | void main() { 6 | group('[Driver -> Counter App]', () { 7 | // First, define the Finders and use them to locate widgets from the 8 | // test suite. Note: the Strings provided to the `byValueKey` method must 9 | // be the same as the Strings we used for the Keys in step 1. 10 | final counterTextFinder = find.byValueKey('counter'); 11 | final buttonFinder = find.byValueKey('increment'); 12 | 13 | FlutterDriver _driver; 14 | 15 | // Connect to the Flutter driver before running any tests. 16 | setUpAll(() async { 17 | _driver = await FlutterDriver.connect(); 18 | }); 19 | 20 | // Close the connection to the driver after the tests have completed. 21 | tearDownAll(() async { 22 | if (_driver != null) { 23 | await _driver.close(); 24 | } 25 | }); 26 | 27 | test('starts at 0', () async { 28 | // Use the `driver.getText` method to verify the counter starts at 0. 29 | expect(await _driver.getText(counterTextFinder), "0"); 30 | }); 31 | 32 | test('increments the counter', () async { 33 | // First, tap the button. 34 | await _driver.tap(buttonFinder); 35 | 36 | // Then, verify the counter text is incremented by 1. 37 | expect(await _driver.getText(counterTextFinder), "1"); 38 | }); 39 | }); 40 | } 41 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | full_testing_flutter 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /sylph.yaml: -------------------------------------------------------------------------------- 1 | # Config file for Flutter tests on real device pools. 2 | # Auto-creates projects and device pools if needed. 3 | # Configures android and ios test runs. 4 | # Builds app, uploads and runs tests. 5 | # Then monitors tests, returns final pass/fail result and downloads artifacts. 6 | # Note: assumes the 'aws' command line utility is logged-in. 7 | 8 | # sylph config 9 | tmp_dir: /tmp/sylph 10 | artifacts_dir: /tmp/sylph_artifacts 11 | # local timeout per device farm run 12 | sylph_timeout: 900 # seconds approx 13 | # run on ios and android pools concurrently (for faster results) 14 | concurrent_runs: true 15 | 16 | # device farm config 17 | project_name: full_testing_codemagic 18 | default_job_timeout: 15 # minutes, set at project creation 19 | 20 | device_pools: 21 | 22 | # - pool_name: Sony 23 | # pool_type: android 24 | # devices: 25 | # - name: Sony Xperia XZ3 26 | # model: H8416 27 | # os: 9.0.0 28 | 29 | - pool_name: Samsung Galaxy 30 | pool_type: android 31 | devices: 32 | - name: Samsung Galaxy S9+ (Unlocked) 33 | model: SM-G965U1 34 | os: 8.0.0 35 | - name: Samsung Galaxy J7 (2018) 36 | model: SM-J737U 37 | os: 8.0.0 38 | 39 | # - pool_name: iPhone latest 40 | # pool_type: ios 41 | # devices: 42 | # - name: Apple iPhone 11 Pro Max 43 | # model: MWGY2LL/A 44 | # os: 13.1.3 45 | 46 | test_suites: 47 | 48 | - test_suite: Only Android tests 49 | main: test_driver/app.dart 50 | tests: 51 | - test_driver/app_test.dart 52 | pool_names: 53 | # - Sony Xperia XZ3 54 | - Samsung Galaxy 55 | # - iPhone latest 56 | job_timeout: 20 # minutes, set per job, over-rides default job timeout above 57 | -------------------------------------------------------------------------------- /test/unit/provider_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_test/flutter_test.dart'; 3 | import 'package:provider/provider.dart'; 4 | 5 | import 'package:full_testing_flutter/main.dart'; 6 | import 'package:full_testing_flutter/counter.dart'; 7 | 8 | void main() async { 9 | group('[Provider]', () { 10 | testWidgets('Update when the value changes', (tester) async { 11 | final _providerKey = GlobalKey(); 12 | BuildContext context; 13 | 14 | await tester.pumpWidget(ChangeNotifierProvider( 15 | key: _providerKey, 16 | create: (c) { 17 | context = c; 18 | return Counter(); 19 | }, 20 | child: MyApp(), 21 | )); 22 | 23 | // Check the context test... 24 | expect(context, equals(_providerKey.currentContext)); 25 | 26 | /// Only the descendants of the `ChangeNotifierProvider` 27 | /// can call `Provider.of`, so find his context... 28 | final BuildContext childContext = tester.element(find.byType(MyApp)); 29 | 30 | // Check the initial value provider 0... 31 | expect(Provider.of(childContext).value, 0); 32 | 33 | // Increment value... 34 | Provider.of(childContext).increment(); 35 | 36 | // Delay the pump... 37 | await Future.microtask(tester.pump); 38 | 39 | // Check incremented value... 40 | expect(Provider.of(childContext).value, 1); 41 | 42 | // Decrement value... 43 | Provider.of(childContext, listen: false).decrement(); 44 | 45 | // Delay the pump... 46 | await Future.microtask(tester.pump); 47 | 48 | // Check decremented value... 49 | expect(Provider.of(childContext).value, 0); 50 | }); 51 | }); 52 | } 53 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 8 | 12 | 19 | 23 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /test/widget/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility that Flutter provides. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | import 'package:provider/provider.dart'; 11 | 12 | import 'package:full_testing_flutter/main.dart'; 13 | import 'package:full_testing_flutter/counter.dart'; 14 | 15 | void main() { 16 | group('[Widget -> Main page]', () { 17 | testWidgets('Counter increments test', (WidgetTester tester) async { 18 | // Build our app and trigger a frame. 19 | await tester.pumpWidget( 20 | ChangeNotifierProvider.value( 21 | value: Counter(), 22 | child: MyApp(), 23 | ), 24 | ); 25 | 26 | // Verify that our counter starts at 0. 27 | expect(find.text('0'), findsOneWidget); 28 | expect(find.text('1'), findsNothing); 29 | 30 | // verify if have a 'Floating Action Button' widget. 31 | expect(find.byType(FloatingActionButton), findsOneWidget); 32 | 33 | // Tap the '+' icon and trigger a frame. 34 | await tester.tap(find.byIcon(Icons.add)); 35 | // Rebuild the widget with the new value. 36 | await tester.pump(); 37 | 38 | // Verify that our counter has incremented. 39 | expect(find.text('0'), findsNothing); 40 | expect(find.text('1'), findsOneWidget); 41 | }); 42 | 43 | testWidgets('Default text test', (WidgetTester tester) async { 44 | // Build our app and trigger a frame. 45 | await tester.pumpWidget(MyApp()); 46 | 47 | // Verify that our default text is 'You have pushed the button this many times:'. 48 | expect(find.text('You have pushed the button this many times:'), 49 | findsOneWidget); 50 | }); 51 | }); 52 | } 53 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion 28 30 | 31 | sourceSets { 32 | main.java.srcDirs += 'src/main/kotlin' 33 | } 34 | 35 | lintOptions { 36 | disable 'InvalidPackage' 37 | } 38 | 39 | defaultConfig { 40 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 41 | applicationId "br.com.chinnonsantos.full_testing_flutter" 42 | minSdkVersion 16 43 | targetSdkVersion 28 44 | versionCode flutterVersionCode.toInteger() 45 | versionName flutterVersionName 46 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 47 | } 48 | 49 | buildTypes { 50 | release { 51 | // TODO: Add your own signing config for the release build. 52 | // Signing with the debug keys for now, so `flutter run --release` works. 53 | signingConfig signingConfigs.debug 54 | } 55 | } 56 | } 57 | 58 | flutter { 59 | source '../..' 60 | } 61 | 62 | dependencies { 63 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 64 | testImplementation 'junit:junit:4.12' 65 | androidTestImplementation 'androidx.test:runner:1.1.1' 66 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' 67 | } 68 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:provider/provider.dart'; 3 | import 'package:full_testing_flutter/counter.dart'; 4 | 5 | void main() => runApp(MyApp()); 6 | 7 | class MyApp extends StatelessWidget { 8 | // This widget is the root of your application. 9 | @override 10 | Widget build(BuildContext context) { 11 | // Provide the model to all widgets within the app. We're using 12 | // ChangeNotifierProvider because that's a simple way to rebuild 13 | // widgets when a model changes. We could also just use 14 | // Provider, but then we would have to listen to Counter ourselves. 15 | // 16 | // Read Provider's docs to learn about all the available providers. 17 | return ChangeNotifierProvider( 18 | // Initialize the model in the builder. That way, Provider 19 | // can own Counter's lifecycle, making sure to call `dispose` 20 | // when not needed anymore. 21 | create: (context) => Counter(), 22 | child: MaterialApp( 23 | title: 'Flutter Demo', 24 | theme: ThemeData( 25 | primarySwatch: Colors.blue, 26 | ), 27 | home: MyHomePage(title: 'Flutter Demo Home Page'), 28 | ), 29 | ); 30 | } 31 | } 32 | 33 | class MyHomePage extends StatelessWidget { 34 | final String title; 35 | 36 | MyHomePage({this.title}); 37 | 38 | @override 39 | Widget build(BuildContext context) { 40 | return Scaffold( 41 | appBar: AppBar( 42 | title: Text(title), 43 | ), 44 | body: Center( 45 | child: Column( 46 | mainAxisAlignment: MainAxisAlignment.center, 47 | children: [ 48 | Text( 49 | 'You have pushed the button this many times:', 50 | ), 51 | // Consumer looks for an ancestor Provider widget 52 | // and retrieves its model (Counter, in this case). 53 | // Then it uses that model to build widgets, and will trigger 54 | // rebuilds if the model is updated. 55 | Consumer( 56 | builder: (context, counter, child) => Text( 57 | '${counter.value}', 58 | key: Key('counter'), 59 | style: Theme.of(context).textTheme.display1, 60 | ), 61 | ), 62 | ], 63 | ), 64 | ), 65 | floatingActionButton: FloatingActionButton( 66 | // Provider.of is another way to access the model object held 67 | // by an ancestor Provider. By default, even this listens to 68 | // changes in the model, and rebuilds the whole encompassing widget 69 | // when notified. 70 | // 71 | // By using `listen: false` below, we are disabling that 72 | // behavior. We are only calling a function here, and so we don't care 73 | // about the current value. Without `listen: false`, we'd be rebuilding 74 | // the whole MyHomePage whenever Counter notifies listeners. 75 | key: Key('increment'), 76 | onPressed: () => 77 | Provider.of(context, listen: false).increment(), 78 | tooltip: 'Increment', 79 | child: Icon(Icons.add), 80 | ), 81 | ); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /.github/workflows/detekt-analysis.yml: -------------------------------------------------------------------------------- 1 | # This workflow performs a static analysis of your Kotlin source code using 2 | # Detekt. 3 | # 4 | # Scans are triggered: 5 | # 1. On every push to default and protected branches 6 | # 2. On every Pull Request targeting the default branch 7 | # 3. On a weekly schedule 8 | # 4. Manually, on demand, via the "workflow_dispatch" event 9 | # 10 | # The workflow should work with no modifications, but you might like to use a 11 | # later version of the Detekt CLI by modifing the $DETEKT_RELEASE_TAG 12 | # environment variable. 13 | name: Scan with Detekt 14 | 15 | on: 16 | # Triggers the workflow on push or pull request events but only for default and protected branches 17 | push: 18 | branches: [ master ] 19 | pull_request: 20 | branches: [ master ] 21 | schedule: 22 | - cron: '38 10 * * 1' 23 | 24 | # Allows you to run this workflow manually from the Actions tab 25 | workflow_dispatch: 26 | 27 | env: 28 | # Release tag associated with version of Detekt to be installed 29 | # SARIF support (required for this workflow) was introduced in Detekt v1.15.0 30 | DETEKT_RELEASE_TAG: v1.15.0 31 | 32 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 33 | jobs: 34 | # This workflow contains a single job called "scan" 35 | scan: 36 | name: Scan 37 | # The type of runner that the job will run on 38 | runs-on: ubuntu-latest 39 | 40 | # Steps represent a sequence of tasks that will be executed as part of the job 41 | steps: 42 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 43 | - uses: actions/checkout@v2 44 | 45 | # Gets the download URL associated with the $DETEKT_RELEASE_TAG 46 | - name: Get Detekt download URL 47 | id: detekt_info 48 | env: 49 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 50 | run: | 51 | DETEKT_DOWNLOAD_URL=$( gh api graphql --field tagName=$DETEKT_RELEASE_TAG --raw-field query=' 52 | query getReleaseAssetDownloadUrl($tagName: String!) { 53 | repository(name: "detekt", owner: "detekt") { 54 | release(tagName: $tagName) { 55 | releaseAssets(name: "detekt", first: 1) { 56 | nodes { 57 | downloadUrl 58 | } 59 | } 60 | } 61 | } 62 | } 63 | ' | \ 64 | jq --raw-output '.data.repository.release.releaseAssets.nodes[0].downloadUrl' ) 65 | echo "::set-output name=download_url::$DETEKT_DOWNLOAD_URL" 66 | 67 | # Sets up the detekt cli 68 | - name: Setup Detekt 69 | run: | 70 | dest=$( mktemp -d ) 71 | curl --request GET \ 72 | --url ${{ steps.detekt_info.outputs.download_url }} \ 73 | --silent \ 74 | --location \ 75 | --output $dest/detekt 76 | chmod a+x $dest/detekt 77 | echo $dest >> $GITHUB_PATH 78 | 79 | # Performs static analysis using Detekt 80 | - name: Run Detekt 81 | continue-on-error: true 82 | run: | 83 | detekt --input ${{ github.workspace }} --report sarif:${{ github.workspace }}/detekt.sarif.json 84 | 85 | # Modifies the SARIF output produced by Detekt so that absolute URIs are relative 86 | # This is so we can easily map results onto their source files 87 | # This can be removed once relative URI support lands in Detekt: https://git.io/JLBbA 88 | - name: Make artifact location URIs relative 89 | continue-on-error: true 90 | run: | 91 | echo "$( 92 | jq \ 93 | --arg github_workspace ${{ github.workspace }} \ 94 | '. | ( .runs[].results[].locations[].physicalLocation.artifactLocation.uri |= if test($github_workspace) then .[($github_workspace | length | . + 1):] else . end )' \ 95 | ${{ github.workspace }}/detekt.sarif.json 96 | )" > ${{ github.workspace }}/detekt.sarif.json 97 | 98 | # Uploads results to GitHub repository using the upload-sarif action 99 | - uses: github/codeql-action/upload-sarif@v1 100 | with: 101 | # Path to SARIF file relative to the root of the repository 102 | sarif_file: ${{ github.workspace }}/detekt.sarif.json 103 | checkout_path: ${{ github.workspace }} 104 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Flutter App's simplest automated full test 2 | 3 | [![Codemagic build status](https://api.codemagic.io/apps/5ddbe31c011bc93c37050c9f/5ddbe31c011bc93c37050c9e/status_badge.svg)](https://codemagic.io/apps/5ddbe31c011bc93c37050c9f/5ddbe31c011bc93c37050c9e/latest_build) [![Travis build status](https://img.shields.io/travis/chinnonsantos/full_testing_flutter/master?logo=travis)](https://travis-ci.org/chinnonsantos/full_testing_flutter) [![Codecov coverage](https://codecov.io/gh/chinnonsantos/full_testing_flutter/branch/master/graph/badge.svg)](https://codecov.io/gh/chinnonsantos/full_testing_flutter) [![Flutter version](https://img.shields.io/badge/flutter-v1.11.0-blue?logo=flutter)](https://flutter.dev/docs/get-started/install) [![GitHub license](https://img.shields.io/github/license/chinnonsantos/full_testing_flutter)](https://choosealicense.com/licenses/mit/) [![Twitter follow](https://img.shields.io/twitter/follow/chinnonsantos?label=follow&style=flat&logo=twitter)](https://twitter.com/intent/follow?screen_name=chinnonsantos) [![Slack channel](https://img.shields.io/badge/slack-%23geral-blueviolet?logo=slack)](https://join.slack.com/t/chinnonsantos-nudemo/signup) [![Open source Love](https://badges.frapsoft.com/os/v2/open-source.svg?v=103)](https://github.com/ellerbrock/open-source-badges/) 4 | 5 | This project shows an example of the main forms of automated testing in Flutter mobile App, including integration into a [CI/CD platform][], as follows: 6 | 7 | - [Unitary][] (including [mocking][] on unitary); 8 | - [Widgets][]; 9 | - [Integration][] (or assertion). 10 | 11 | Using native libraries or recommended by official Flutter documentation (Google). 12 | 13 | > Note that everything here fits within the guidelines set out in [Effective Dart][]. 14 | 15 | [CI/CD platform]: https://en.wikipedia.org/wiki/CI/CD 16 | [Unitary]: https://flutter.dev/docs/cookbook/testing/unit/introduction 17 | [mocking]: https://flutter.dev/docs/cookbook/testing/unit/mocking 18 | [Widgets]: https://flutter.dev/docs/cookbook/testing/widget/introduction 19 | [Integration]: https://flutter.dev/docs/cookbook/testing/integration/introduction 20 | [Effective Dart]: https://www.dartlang.org/guides/language/effective-dart 21 | 22 | ## Nudemo - Flutter APP + AWS DeviceFarm Automation Tests (Backend in Clojure) 23 | 24 | [Captura de Tela 2024-09-23 às 16 57 46](https://www.youtube.com/watch?v=cBgz7RTjDeo) 25 | 26 | https://hub.docker.com/u/chinnonsantos 27 | 28 | ## Codemagic - CI for Flutter 29 | 30 | At the [Flutter Live][] 2018 conference in London, [Nevercode][] launched their dedicated CI/CD solution for Flutter apps which is known as [Codemagic][]. 31 | 32 | This project uses **Codemagic for CI/CD**, selected after various analysis and testing with other CI platforms ([Travis CI][], [Codecov][], [Coveralls][]...), which support the Dart language (in some cases only Dart < 2.0), but do not have good support for the Flutter App. 33 | 34 | > "Codemagic is the official CI/CD solution dedicated just for Flutter apps." 35 | > \- Getting Started with Codemagic 36 | 37 | See more details about Codemagic in '[Getting Started with Codemagic]'. 38 | 39 | [Flutter Live]: https://developers.google.com/events/flutter-live/ 40 | [Nevercode]: https://nevercode.io/ 41 | [Codemagic]: https://codemagic.io/ 42 | [Travis CI]: https://travis-ci.org/ 43 | [Codecov]: https://codecov.io/ 44 | [Coveralls]: https://coveralls.io/ 45 | [Getting Started with Codemagic]: https://blog.codemagic.io/getting-started-with-codemagic/ 46 | 47 | ## Prerequisites 48 | 49 | You will need [Flutter][] framework v1.11.0 or above installed ([Channel beta][], on Linux, locale en_US.UTF-8). 50 | 51 | > The Dart SDK **is not required** because Flutter has _[Dart language][]_ support as an integrated tool in the framework. 52 | 53 | [Flutter]: https://flutter.dev/ 54 | [Channel beta]: https://github.com/flutter/flutter/wiki/Flutter-build-release-channels#beta 55 | [Dart language]: https://dart.dev/ 56 | 57 | **Libraries:** 58 | 59 | - [test][] 1.6.3 60 | - [provider][] 3.1.0+1 61 | - [pedantic][] 1.8.0+1 (dev) 62 | 63 | [test]: https://pub.dev/packages/test 64 | [provider]: https://pub.dev/packages/provider 65 | [pedantic]: https://pub.dev/packages/pedantic 66 | 67 | ## Running tests 68 | 69 | To automatically [formatting][] code, run: 70 | 71 | flutter format lib test test_driver 72 | 73 | [formatting]: https://flutter.dev/docs/development/tools/formatting 74 | 75 | To analyzing the Dart language code, run: 76 | 77 | flutter analyze 78 | 79 | > The [Dart analyzer][] will check your code and look for possible errors. 80 | 81 | [Dart analyzer]: https://flutter.dev/docs/testing/debugging#the-dart-analyzer 82 | 83 | To [testing] the project, run: 84 | 85 | flutter test 86 | 87 | [testing]: https://flutter.dev/docs/testing 88 | 89 | To check test coverage, run: 90 | 91 | - Run test with `--coverage` flag: 92 | 93 | flutter test --coverage 94 | 95 | - Convert the LCOV report generated to a readable HTML file: 96 | 97 | genhtml coverage/lcov.info -o coverage/html 98 | 99 | > The **`flutter test --coverage`** command will generate a **`lcov.info`** file, you will need to install the **[LCOV][]** program to convert (**`genhtml ...`**) the report to an HTML file (human readable). 100 | 101 | - Open the HTML report (with a Web Browser) 102 | 103 | google-chrome coverage/html/index.html 104 | 105 | [LCOV]: http://ltp.sourceforge.net/coverage/lcov.php 106 | 107 | To test only **Unit tests** of the project, run: 108 | 109 | flutter test test/unit/ 110 | 111 | To test only **Widget tests** of the project, run: 112 | 113 | flutter test test/widget/ 114 | 115 | To test only **Integration** (or assertion) of the project, run: 116 | 117 | flutter drive --target=test_driver/app.dart 118 | 119 | _-->> First, be sure to launch an Android Emulator, iOS Simulator, or connect your computer to a real iOS / Android device. **Integration testing needs to be executed on a real system (simulator or device)!**_ 120 | 121 | > "Unlike unit and widget tests, integration test suites do not run in the same process as the app being tested. Therefore, create two files that reside in the same directory. By convention, the directory is named **`test_driver`**." 122 | > \- An introduction to integration testing 123 | 124 | To run **Formatting code** ✔️; **Analyzing code** 🔍; **Unit test code** 🆗; **Widget test** 📲 and **Test coverage** ☔️. everything together ⏲️: 125 | 126 | sh scripts/flutter_test.sh 127 | 128 | ## Drive testing on AWS Device Farm with Sylph 129 | 130 | To runs Flutter integration tests on real devices in cloud, use the **Sylph**. 131 | 132 | - Install Sylph: 133 | 134 | pub global activate sylph 135 | 136 | > For more details see [Sylph][]. 137 | 138 | - Configure the [AWS CLI][] credentials: 139 | 140 | $ aws configure 141 | AWS Access Key ID [None]: YOUR_KEY_ID_HERE 142 | AWS Secret Access Key [None]: YOUR_SECRET_ACCESS_KEY_HERE 143 | Default region name [None]: us-west-2 144 | Default output format [None]: json 145 | 146 | > The AWS Device Farm is only available in Oregon region (**us-west-2**)! 147 | 148 | - Run the Sylph: 149 | 150 | sylph 151 | 152 | > Sylph uses the [`sylph.yaml`][] file in this repository to configure and run device on AWS. 153 | >> By default, it has only two Android devices (Samsung Galaxy S9+ and Samsung Galaxy J7). 154 | >> Running iOS devices requires an [Apple Developer Certificate] (Team ID), We don't cover this steps! 155 | 156 | ![Screenshot from 2019-11-26 16-36-14](https://user-images.githubusercontent.com/3258293/69670720-47cb2300-1073-11ea-8035-1754d43ae395.png) 157 | 158 | [Sylph]: https://github.com/mmcc007/sylph 159 | [AWS CLI]: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html 160 | [`sylph.yaml`]: https://github.com/chinnonsantos/full_testing_flutter/blob/master/sylph.yaml 161 | [Apple Developer Certificate]: https://developer.apple.com/account/#/membership 162 | 163 | ## Drive testing on Codemagic CI/CD (using AWS Device Farm and Sylph) 164 | 165 | Execute the same process when previous step **"Drive testing on AWS Device Farm with Sylph"**. 166 | 167 | When you can run local drive testing with Sylph on AWS Device Farm, see [this article] to learn how to configure Codemagic console to automate the process. 168 | 169 | ![Screenshot from 2019-11-27 09-53-00](https://user-images.githubusercontent.com/3258293/69724965-d71c1900-10fb-11ea-870b-b6d3aab44e2b.png) 170 | 171 | [this article]: https://blog.codemagic.io/flutter-ci-cd-with-codemagic-sylph-aws-device-farm/ 172 | 173 | ## Running the APP 174 | 175 | To start the mobile App example, run: 176 | 177 | flutter run 178 | 179 | ## License 180 | 181 | Copyright © 2019 | Chinnon Santos | MIT 182 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | analyzer: 5 | dependency: transitive 6 | description: 7 | name: analyzer 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "0.36.4" 11 | archive: 12 | dependency: transitive 13 | description: 14 | name: archive 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "2.0.11" 18 | args: 19 | dependency: transitive 20 | description: 21 | name: args 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "1.5.2" 25 | async: 26 | dependency: transitive 27 | description: 28 | name: async 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "2.4.0" 32 | boolean_selector: 33 | dependency: transitive 34 | description: 35 | name: boolean_selector 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "1.0.5" 39 | charcode: 40 | dependency: transitive 41 | description: 42 | name: charcode 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "1.1.2" 46 | collection: 47 | dependency: transitive 48 | description: 49 | name: collection 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.14.11" 53 | convert: 54 | dependency: transitive 55 | description: 56 | name: convert 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "2.1.1" 60 | coverage: 61 | dependency: transitive 62 | description: 63 | name: coverage 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "0.13.3+3" 67 | crypto: 68 | dependency: transitive 69 | description: 70 | name: crypto 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "2.1.3" 74 | csslib: 75 | dependency: transitive 76 | description: 77 | name: csslib 78 | url: "https://pub.dartlang.org" 79 | source: hosted 80 | version: "0.16.1" 81 | cupertino_icons: 82 | dependency: "direct main" 83 | description: 84 | name: cupertino_icons 85 | url: "https://pub.dartlang.org" 86 | source: hosted 87 | version: "0.1.3" 88 | file: 89 | dependency: transitive 90 | description: 91 | name: file 92 | url: "https://pub.dartlang.org" 93 | source: hosted 94 | version: "5.1.0" 95 | flutter: 96 | dependency: "direct main" 97 | description: flutter 98 | source: sdk 99 | version: "0.0.0" 100 | flutter_driver: 101 | dependency: "direct dev" 102 | description: flutter 103 | source: sdk 104 | version: "0.0.0" 105 | flutter_test: 106 | dependency: "direct dev" 107 | description: flutter 108 | source: sdk 109 | version: "0.0.0" 110 | front_end: 111 | dependency: transitive 112 | description: 113 | name: front_end 114 | url: "https://pub.dartlang.org" 115 | source: hosted 116 | version: "0.1.19" 117 | fuchsia_remote_debug_protocol: 118 | dependency: transitive 119 | description: flutter 120 | source: sdk 121 | version: "0.0.0" 122 | glob: 123 | dependency: transitive 124 | description: 125 | name: glob 126 | url: "https://pub.dartlang.org" 127 | source: hosted 128 | version: "1.2.0" 129 | html: 130 | dependency: transitive 131 | description: 132 | name: html 133 | url: "https://pub.dartlang.org" 134 | source: hosted 135 | version: "0.14.0+3" 136 | http: 137 | dependency: transitive 138 | description: 139 | name: http 140 | url: "https://pub.dartlang.org" 141 | source: hosted 142 | version: "0.12.0+2" 143 | http_multi_server: 144 | dependency: transitive 145 | description: 146 | name: http_multi_server 147 | url: "https://pub.dartlang.org" 148 | source: hosted 149 | version: "2.1.0" 150 | http_parser: 151 | dependency: transitive 152 | description: 153 | name: http_parser 154 | url: "https://pub.dartlang.org" 155 | source: hosted 156 | version: "3.1.3" 157 | image: 158 | dependency: transitive 159 | description: 160 | name: image 161 | url: "https://pub.dartlang.org" 162 | source: hosted 163 | version: "2.1.4" 164 | intl: 165 | dependency: transitive 166 | description: 167 | name: intl 168 | url: "https://pub.dartlang.org" 169 | source: hosted 170 | version: "0.16.0" 171 | io: 172 | dependency: transitive 173 | description: 174 | name: io 175 | url: "https://pub.dartlang.org" 176 | source: hosted 177 | version: "0.3.3" 178 | js: 179 | dependency: transitive 180 | description: 181 | name: js 182 | url: "https://pub.dartlang.org" 183 | source: hosted 184 | version: "0.6.1+1" 185 | json_rpc_2: 186 | dependency: transitive 187 | description: 188 | name: json_rpc_2 189 | url: "https://pub.dartlang.org" 190 | source: hosted 191 | version: "2.1.0" 192 | kernel: 193 | dependency: transitive 194 | description: 195 | name: kernel 196 | url: "https://pub.dartlang.org" 197 | source: hosted 198 | version: "0.3.19" 199 | logging: 200 | dependency: transitive 201 | description: 202 | name: logging 203 | url: "https://pub.dartlang.org" 204 | source: hosted 205 | version: "0.11.3+2" 206 | matcher: 207 | dependency: transitive 208 | description: 209 | name: matcher 210 | url: "https://pub.dartlang.org" 211 | source: hosted 212 | version: "0.12.6" 213 | meta: 214 | dependency: transitive 215 | description: 216 | name: meta 217 | url: "https://pub.dartlang.org" 218 | source: hosted 219 | version: "1.1.8" 220 | mime: 221 | dependency: transitive 222 | description: 223 | name: mime 224 | url: "https://pub.dartlang.org" 225 | source: hosted 226 | version: "0.9.6+3" 227 | multi_server_socket: 228 | dependency: transitive 229 | description: 230 | name: multi_server_socket 231 | url: "https://pub.dartlang.org" 232 | source: hosted 233 | version: "1.0.2" 234 | node_interop: 235 | dependency: transitive 236 | description: 237 | name: node_interop 238 | url: "https://pub.dartlang.org" 239 | source: hosted 240 | version: "1.0.3" 241 | node_io: 242 | dependency: transitive 243 | description: 244 | name: node_io 245 | url: "https://pub.dartlang.org" 246 | source: hosted 247 | version: "1.0.1+2" 248 | node_preamble: 249 | dependency: transitive 250 | description: 251 | name: node_preamble 252 | url: "https://pub.dartlang.org" 253 | source: hosted 254 | version: "1.4.8" 255 | package_config: 256 | dependency: transitive 257 | description: 258 | name: package_config 259 | url: "https://pub.dartlang.org" 260 | source: hosted 261 | version: "1.1.0" 262 | package_resolver: 263 | dependency: transitive 264 | description: 265 | name: package_resolver 266 | url: "https://pub.dartlang.org" 267 | source: hosted 268 | version: "1.0.10" 269 | path: 270 | dependency: transitive 271 | description: 272 | name: path 273 | url: "https://pub.dartlang.org" 274 | source: hosted 275 | version: "1.6.4" 276 | pedantic: 277 | dependency: "direct dev" 278 | description: 279 | name: pedantic 280 | url: "https://pub.dartlang.org" 281 | source: hosted 282 | version: "1.8.0+1" 283 | petitparser: 284 | dependency: transitive 285 | description: 286 | name: petitparser 287 | url: "https://pub.dartlang.org" 288 | source: hosted 289 | version: "2.4.0" 290 | platform: 291 | dependency: transitive 292 | description: 293 | name: platform 294 | url: "https://pub.dartlang.org" 295 | source: hosted 296 | version: "2.2.1" 297 | pool: 298 | dependency: transitive 299 | description: 300 | name: pool 301 | url: "https://pub.dartlang.org" 302 | source: hosted 303 | version: "1.4.0" 304 | process: 305 | dependency: transitive 306 | description: 307 | name: process 308 | url: "https://pub.dartlang.org" 309 | source: hosted 310 | version: "3.0.12" 311 | provider: 312 | dependency: "direct main" 313 | description: 314 | name: provider 315 | url: "https://pub.dartlang.org" 316 | source: hosted 317 | version: "3.2.0" 318 | pub_semver: 319 | dependency: transitive 320 | description: 321 | name: pub_semver 322 | url: "https://pub.dartlang.org" 323 | source: hosted 324 | version: "1.4.2" 325 | quiver: 326 | dependency: transitive 327 | description: 328 | name: quiver 329 | url: "https://pub.dartlang.org" 330 | source: hosted 331 | version: "2.0.5" 332 | shelf: 333 | dependency: transitive 334 | description: 335 | name: shelf 336 | url: "https://pub.dartlang.org" 337 | source: hosted 338 | version: "0.7.5" 339 | shelf_packages_handler: 340 | dependency: transitive 341 | description: 342 | name: shelf_packages_handler 343 | url: "https://pub.dartlang.org" 344 | source: hosted 345 | version: "1.0.4" 346 | shelf_static: 347 | dependency: transitive 348 | description: 349 | name: shelf_static 350 | url: "https://pub.dartlang.org" 351 | source: hosted 352 | version: "0.2.8" 353 | shelf_web_socket: 354 | dependency: transitive 355 | description: 356 | name: shelf_web_socket 357 | url: "https://pub.dartlang.org" 358 | source: hosted 359 | version: "0.2.3" 360 | sky_engine: 361 | dependency: transitive 362 | description: flutter 363 | source: sdk 364 | version: "0.0.99" 365 | source_map_stack_trace: 366 | dependency: transitive 367 | description: 368 | name: source_map_stack_trace 369 | url: "https://pub.dartlang.org" 370 | source: hosted 371 | version: "1.1.5" 372 | source_maps: 373 | dependency: transitive 374 | description: 375 | name: source_maps 376 | url: "https://pub.dartlang.org" 377 | source: hosted 378 | version: "0.10.8" 379 | source_span: 380 | dependency: transitive 381 | description: 382 | name: source_span 383 | url: "https://pub.dartlang.org" 384 | source: hosted 385 | version: "1.5.5" 386 | stack_trace: 387 | dependency: transitive 388 | description: 389 | name: stack_trace 390 | url: "https://pub.dartlang.org" 391 | source: hosted 392 | version: "1.9.3" 393 | stream_channel: 394 | dependency: transitive 395 | description: 396 | name: stream_channel 397 | url: "https://pub.dartlang.org" 398 | source: hosted 399 | version: "2.0.0" 400 | string_scanner: 401 | dependency: transitive 402 | description: 403 | name: string_scanner 404 | url: "https://pub.dartlang.org" 405 | source: hosted 406 | version: "1.0.5" 407 | term_glyph: 408 | dependency: transitive 409 | description: 410 | name: term_glyph 411 | url: "https://pub.dartlang.org" 412 | source: hosted 413 | version: "1.1.0" 414 | test: 415 | dependency: "direct main" 416 | description: 417 | name: test 418 | url: "https://pub.dartlang.org" 419 | source: hosted 420 | version: "1.9.4" 421 | test_api: 422 | dependency: transitive 423 | description: 424 | name: test_api 425 | url: "https://pub.dartlang.org" 426 | source: hosted 427 | version: "0.2.11" 428 | test_core: 429 | dependency: transitive 430 | description: 431 | name: test_core 432 | url: "https://pub.dartlang.org" 433 | source: hosted 434 | version: "0.2.15" 435 | typed_data: 436 | dependency: transitive 437 | description: 438 | name: typed_data 439 | url: "https://pub.dartlang.org" 440 | source: hosted 441 | version: "1.1.6" 442 | vector_math: 443 | dependency: transitive 444 | description: 445 | name: vector_math 446 | url: "https://pub.dartlang.org" 447 | source: hosted 448 | version: "2.0.8" 449 | vm_service: 450 | dependency: transitive 451 | description: 452 | name: vm_service 453 | url: "https://pub.dartlang.org" 454 | source: hosted 455 | version: "2.1.3" 456 | vm_service_client: 457 | dependency: transitive 458 | description: 459 | name: vm_service_client 460 | url: "https://pub.dartlang.org" 461 | source: hosted 462 | version: "0.2.6+2" 463 | watcher: 464 | dependency: transitive 465 | description: 466 | name: watcher 467 | url: "https://pub.dartlang.org" 468 | source: hosted 469 | version: "0.9.7+13" 470 | web_socket_channel: 471 | dependency: transitive 472 | description: 473 | name: web_socket_channel 474 | url: "https://pub.dartlang.org" 475 | source: hosted 476 | version: "1.1.0" 477 | xml: 478 | dependency: transitive 479 | description: 480 | name: xml 481 | url: "https://pub.dartlang.org" 482 | source: hosted 483 | version: "3.5.0" 484 | yaml: 485 | dependency: transitive 486 | description: 487 | name: yaml 488 | url: "https://pub.dartlang.org" 489 | source: hosted 490 | version: "2.2.0" 491 | sdks: 492 | dart: ">=2.4.0 <3.0.0" 493 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 13 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 14 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 15 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 16 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 17 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 18 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 19 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXCopyFilesBuildPhase section */ 23 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 24 | isa = PBXCopyFilesBuildPhase; 25 | buildActionMask = 2147483647; 26 | dstPath = ""; 27 | dstSubfolderSpec = 10; 28 | files = ( 29 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, 30 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, 31 | ); 32 | name = "Embed Frameworks"; 33 | runOnlyForDeploymentPostprocessing = 0; 34 | }; 35 | /* End PBXCopyFilesBuildPhase section */ 36 | 37 | /* Begin PBXFileReference section */ 38 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 39 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 40 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 41 | 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 42 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 43 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 44 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 45 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 46 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 47 | 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; 48 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 50 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 51 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 52 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 53 | /* End PBXFileReference section */ 54 | 55 | /* Begin PBXFrameworksBuildPhase section */ 56 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 57 | isa = PBXFrameworksBuildPhase; 58 | buildActionMask = 2147483647; 59 | files = ( 60 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, 61 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, 62 | ); 63 | runOnlyForDeploymentPostprocessing = 0; 64 | }; 65 | /* End PBXFrameworksBuildPhase section */ 66 | 67 | /* Begin PBXGroup section */ 68 | 9740EEB11CF90186004384FC /* Flutter */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | 3B80C3931E831B6300D905FE /* App.framework */, 72 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 73 | 9740EEBA1CF902C7004384FC /* Flutter.framework */, 74 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 75 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 76 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 77 | ); 78 | name = Flutter; 79 | sourceTree = ""; 80 | }; 81 | 97C146E51CF9000F007C117D = { 82 | isa = PBXGroup; 83 | children = ( 84 | 9740EEB11CF90186004384FC /* Flutter */, 85 | 97C146F01CF9000F007C117D /* Runner */, 86 | 97C146EF1CF9000F007C117D /* Products */, 87 | ); 88 | sourceTree = ""; 89 | }; 90 | 97C146EF1CF9000F007C117D /* Products */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 97C146EE1CF9000F007C117D /* Runner.app */, 94 | ); 95 | name = Products; 96 | sourceTree = ""; 97 | }; 98 | 97C146F01CF9000F007C117D /* Runner */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 102 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 103 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 104 | 97C147021CF9000F007C117D /* Info.plist */, 105 | 97C146F11CF9000F007C117D /* Supporting Files */, 106 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 107 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 108 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 109 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 110 | ); 111 | path = Runner; 112 | sourceTree = ""; 113 | }; 114 | 97C146F11CF9000F007C117D /* Supporting Files */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | ); 118 | name = "Supporting Files"; 119 | sourceTree = ""; 120 | }; 121 | /* End PBXGroup section */ 122 | 123 | /* Begin PBXNativeTarget section */ 124 | 97C146ED1CF9000F007C117D /* Runner */ = { 125 | isa = PBXNativeTarget; 126 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 127 | buildPhases = ( 128 | 9740EEB61CF901F6004384FC /* Run Script */, 129 | 97C146EA1CF9000F007C117D /* Sources */, 130 | 97C146EB1CF9000F007C117D /* Frameworks */, 131 | 97C146EC1CF9000F007C117D /* Resources */, 132 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 133 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 134 | ); 135 | buildRules = ( 136 | ); 137 | dependencies = ( 138 | ); 139 | name = Runner; 140 | productName = Runner; 141 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 142 | productType = "com.apple.product-type.application"; 143 | }; 144 | /* End PBXNativeTarget section */ 145 | 146 | /* Begin PBXProject section */ 147 | 97C146E61CF9000F007C117D /* Project object */ = { 148 | isa = PBXProject; 149 | attributes = { 150 | LastUpgradeCheck = 1020; 151 | ORGANIZATIONNAME = "The Chromium Authors"; 152 | TargetAttributes = { 153 | 97C146ED1CF9000F007C117D = { 154 | CreatedOnToolsVersion = 7.3.1; 155 | LastSwiftMigration = 1100; 156 | }; 157 | }; 158 | }; 159 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 160 | compatibilityVersion = "Xcode 3.2"; 161 | developmentRegion = en; 162 | hasScannedForEncodings = 0; 163 | knownRegions = ( 164 | en, 165 | Base, 166 | ); 167 | mainGroup = 97C146E51CF9000F007C117D; 168 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 169 | projectDirPath = ""; 170 | projectRoot = ""; 171 | targets = ( 172 | 97C146ED1CF9000F007C117D /* Runner */, 173 | ); 174 | }; 175 | /* End PBXProject section */ 176 | 177 | /* Begin PBXResourcesBuildPhase section */ 178 | 97C146EC1CF9000F007C117D /* Resources */ = { 179 | isa = PBXResourcesBuildPhase; 180 | buildActionMask = 2147483647; 181 | files = ( 182 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 183 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 184 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 185 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 186 | ); 187 | runOnlyForDeploymentPostprocessing = 0; 188 | }; 189 | /* End PBXResourcesBuildPhase section */ 190 | 191 | /* Begin PBXShellScriptBuildPhase section */ 192 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 193 | isa = PBXShellScriptBuildPhase; 194 | buildActionMask = 2147483647; 195 | files = ( 196 | ); 197 | inputPaths = ( 198 | ); 199 | name = "Thin Binary"; 200 | outputPaths = ( 201 | ); 202 | runOnlyForDeploymentPostprocessing = 0; 203 | shellPath = /bin/sh; 204 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; 205 | }; 206 | 9740EEB61CF901F6004384FC /* Run Script */ = { 207 | isa = PBXShellScriptBuildPhase; 208 | buildActionMask = 2147483647; 209 | files = ( 210 | ); 211 | inputPaths = ( 212 | ); 213 | name = "Run Script"; 214 | outputPaths = ( 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | shellPath = /bin/sh; 218 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 219 | }; 220 | /* End PBXShellScriptBuildPhase section */ 221 | 222 | /* Begin PBXSourcesBuildPhase section */ 223 | 97C146EA1CF9000F007C117D /* Sources */ = { 224 | isa = PBXSourcesBuildPhase; 225 | buildActionMask = 2147483647; 226 | files = ( 227 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 228 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 229 | ); 230 | runOnlyForDeploymentPostprocessing = 0; 231 | }; 232 | /* End PBXSourcesBuildPhase section */ 233 | 234 | /* Begin PBXVariantGroup section */ 235 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 236 | isa = PBXVariantGroup; 237 | children = ( 238 | 97C146FB1CF9000F007C117D /* Base */, 239 | ); 240 | name = Main.storyboard; 241 | sourceTree = ""; 242 | }; 243 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 244 | isa = PBXVariantGroup; 245 | children = ( 246 | 97C147001CF9000F007C117D /* Base */, 247 | ); 248 | name = LaunchScreen.storyboard; 249 | sourceTree = ""; 250 | }; 251 | /* End PBXVariantGroup section */ 252 | 253 | /* Begin XCBuildConfiguration section */ 254 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 255 | isa = XCBuildConfiguration; 256 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 257 | buildSettings = { 258 | ALWAYS_SEARCH_USER_PATHS = NO; 259 | CLANG_ANALYZER_NONNULL = YES; 260 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 261 | CLANG_CXX_LIBRARY = "libc++"; 262 | CLANG_ENABLE_MODULES = YES; 263 | CLANG_ENABLE_OBJC_ARC = YES; 264 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 265 | CLANG_WARN_BOOL_CONVERSION = YES; 266 | CLANG_WARN_COMMA = YES; 267 | CLANG_WARN_CONSTANT_CONVERSION = YES; 268 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 269 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 270 | CLANG_WARN_EMPTY_BODY = YES; 271 | CLANG_WARN_ENUM_CONVERSION = YES; 272 | CLANG_WARN_INFINITE_RECURSION = YES; 273 | CLANG_WARN_INT_CONVERSION = YES; 274 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 275 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 276 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 277 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 278 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 279 | CLANG_WARN_STRICT_PROTOTYPES = YES; 280 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 281 | CLANG_WARN_UNREACHABLE_CODE = YES; 282 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 283 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 284 | COPY_PHASE_STRIP = NO; 285 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 286 | ENABLE_NS_ASSERTIONS = NO; 287 | ENABLE_STRICT_OBJC_MSGSEND = YES; 288 | GCC_C_LANGUAGE_STANDARD = gnu99; 289 | GCC_NO_COMMON_BLOCKS = YES; 290 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 291 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 292 | GCC_WARN_UNDECLARED_SELECTOR = YES; 293 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 294 | GCC_WARN_UNUSED_FUNCTION = YES; 295 | GCC_WARN_UNUSED_VARIABLE = YES; 296 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 297 | MTL_ENABLE_DEBUG_INFO = NO; 298 | SDKROOT = iphoneos; 299 | SUPPORTED_PLATFORMS = iphoneos; 300 | TARGETED_DEVICE_FAMILY = "1,2"; 301 | VALIDATE_PRODUCT = YES; 302 | }; 303 | name = Profile; 304 | }; 305 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 306 | isa = XCBuildConfiguration; 307 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 308 | buildSettings = { 309 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 310 | CLANG_ENABLE_MODULES = YES; 311 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 312 | ENABLE_BITCODE = NO; 313 | FRAMEWORK_SEARCH_PATHS = ( 314 | "$(inherited)", 315 | "$(PROJECT_DIR)/Flutter", 316 | ); 317 | INFOPLIST_FILE = Runner/Info.plist; 318 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 319 | LIBRARY_SEARCH_PATHS = ( 320 | "$(inherited)", 321 | "$(PROJECT_DIR)/Flutter", 322 | ); 323 | PRODUCT_BUNDLE_IDENTIFIER = br.com.chinnonsantos.fullTestingFlutter; 324 | PRODUCT_NAME = "$(TARGET_NAME)"; 325 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 326 | SWIFT_VERSION = 5.0; 327 | VERSIONING_SYSTEM = "apple-generic"; 328 | }; 329 | name = Profile; 330 | }; 331 | 97C147031CF9000F007C117D /* Debug */ = { 332 | isa = XCBuildConfiguration; 333 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 334 | buildSettings = { 335 | ALWAYS_SEARCH_USER_PATHS = NO; 336 | CLANG_ANALYZER_NONNULL = YES; 337 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 338 | CLANG_CXX_LIBRARY = "libc++"; 339 | CLANG_ENABLE_MODULES = YES; 340 | CLANG_ENABLE_OBJC_ARC = YES; 341 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 342 | CLANG_WARN_BOOL_CONVERSION = YES; 343 | CLANG_WARN_COMMA = YES; 344 | CLANG_WARN_CONSTANT_CONVERSION = YES; 345 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 346 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 347 | CLANG_WARN_EMPTY_BODY = YES; 348 | CLANG_WARN_ENUM_CONVERSION = YES; 349 | CLANG_WARN_INFINITE_RECURSION = YES; 350 | CLANG_WARN_INT_CONVERSION = YES; 351 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 352 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 353 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 354 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 355 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 356 | CLANG_WARN_STRICT_PROTOTYPES = YES; 357 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 358 | CLANG_WARN_UNREACHABLE_CODE = YES; 359 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 360 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 361 | COPY_PHASE_STRIP = NO; 362 | DEBUG_INFORMATION_FORMAT = dwarf; 363 | ENABLE_STRICT_OBJC_MSGSEND = YES; 364 | ENABLE_TESTABILITY = YES; 365 | GCC_C_LANGUAGE_STANDARD = gnu99; 366 | GCC_DYNAMIC_NO_PIC = NO; 367 | GCC_NO_COMMON_BLOCKS = YES; 368 | GCC_OPTIMIZATION_LEVEL = 0; 369 | GCC_PREPROCESSOR_DEFINITIONS = ( 370 | "DEBUG=1", 371 | "$(inherited)", 372 | ); 373 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 374 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 375 | GCC_WARN_UNDECLARED_SELECTOR = YES; 376 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 377 | GCC_WARN_UNUSED_FUNCTION = YES; 378 | GCC_WARN_UNUSED_VARIABLE = YES; 379 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 380 | MTL_ENABLE_DEBUG_INFO = YES; 381 | ONLY_ACTIVE_ARCH = YES; 382 | SDKROOT = iphoneos; 383 | TARGETED_DEVICE_FAMILY = "1,2"; 384 | }; 385 | name = Debug; 386 | }; 387 | 97C147041CF9000F007C117D /* Release */ = { 388 | isa = XCBuildConfiguration; 389 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 390 | buildSettings = { 391 | ALWAYS_SEARCH_USER_PATHS = NO; 392 | CLANG_ANALYZER_NONNULL = YES; 393 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 394 | CLANG_CXX_LIBRARY = "libc++"; 395 | CLANG_ENABLE_MODULES = YES; 396 | CLANG_ENABLE_OBJC_ARC = YES; 397 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 398 | CLANG_WARN_BOOL_CONVERSION = YES; 399 | CLANG_WARN_COMMA = YES; 400 | CLANG_WARN_CONSTANT_CONVERSION = YES; 401 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 402 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 403 | CLANG_WARN_EMPTY_BODY = YES; 404 | CLANG_WARN_ENUM_CONVERSION = YES; 405 | CLANG_WARN_INFINITE_RECURSION = YES; 406 | CLANG_WARN_INT_CONVERSION = YES; 407 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 408 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 409 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 410 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 411 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 412 | CLANG_WARN_STRICT_PROTOTYPES = YES; 413 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 414 | CLANG_WARN_UNREACHABLE_CODE = YES; 415 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 416 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 417 | COPY_PHASE_STRIP = NO; 418 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 419 | ENABLE_NS_ASSERTIONS = NO; 420 | ENABLE_STRICT_OBJC_MSGSEND = YES; 421 | GCC_C_LANGUAGE_STANDARD = gnu99; 422 | GCC_NO_COMMON_BLOCKS = YES; 423 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 424 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 425 | GCC_WARN_UNDECLARED_SELECTOR = YES; 426 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 427 | GCC_WARN_UNUSED_FUNCTION = YES; 428 | GCC_WARN_UNUSED_VARIABLE = YES; 429 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 430 | MTL_ENABLE_DEBUG_INFO = NO; 431 | SDKROOT = iphoneos; 432 | SUPPORTED_PLATFORMS = iphoneos; 433 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 434 | TARGETED_DEVICE_FAMILY = "1,2"; 435 | VALIDATE_PRODUCT = YES; 436 | }; 437 | name = Release; 438 | }; 439 | 97C147061CF9000F007C117D /* Debug */ = { 440 | isa = XCBuildConfiguration; 441 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 442 | buildSettings = { 443 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 444 | CLANG_ENABLE_MODULES = YES; 445 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 446 | ENABLE_BITCODE = NO; 447 | FRAMEWORK_SEARCH_PATHS = ( 448 | "$(inherited)", 449 | "$(PROJECT_DIR)/Flutter", 450 | ); 451 | INFOPLIST_FILE = Runner/Info.plist; 452 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 453 | LIBRARY_SEARCH_PATHS = ( 454 | "$(inherited)", 455 | "$(PROJECT_DIR)/Flutter", 456 | ); 457 | PRODUCT_BUNDLE_IDENTIFIER = br.com.chinnonsantos.fullTestingFlutter; 458 | PRODUCT_NAME = "$(TARGET_NAME)"; 459 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 460 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 461 | SWIFT_VERSION = 5.0; 462 | VERSIONING_SYSTEM = "apple-generic"; 463 | }; 464 | name = Debug; 465 | }; 466 | 97C147071CF9000F007C117D /* Release */ = { 467 | isa = XCBuildConfiguration; 468 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 469 | buildSettings = { 470 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 471 | CLANG_ENABLE_MODULES = YES; 472 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 473 | ENABLE_BITCODE = NO; 474 | FRAMEWORK_SEARCH_PATHS = ( 475 | "$(inherited)", 476 | "$(PROJECT_DIR)/Flutter", 477 | ); 478 | INFOPLIST_FILE = Runner/Info.plist; 479 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 480 | LIBRARY_SEARCH_PATHS = ( 481 | "$(inherited)", 482 | "$(PROJECT_DIR)/Flutter", 483 | ); 484 | PRODUCT_BUNDLE_IDENTIFIER = br.com.chinnonsantos.fullTestingFlutter; 485 | PRODUCT_NAME = "$(TARGET_NAME)"; 486 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 487 | SWIFT_VERSION = 5.0; 488 | VERSIONING_SYSTEM = "apple-generic"; 489 | }; 490 | name = Release; 491 | }; 492 | /* End XCBuildConfiguration section */ 493 | 494 | /* Begin XCConfigurationList section */ 495 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 496 | isa = XCConfigurationList; 497 | buildConfigurations = ( 498 | 97C147031CF9000F007C117D /* Debug */, 499 | 97C147041CF9000F007C117D /* Release */, 500 | 249021D3217E4FDB00AE95B9 /* Profile */, 501 | ); 502 | defaultConfigurationIsVisible = 0; 503 | defaultConfigurationName = Release; 504 | }; 505 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 506 | isa = XCConfigurationList; 507 | buildConfigurations = ( 508 | 97C147061CF9000F007C117D /* Debug */, 509 | 97C147071CF9000F007C117D /* Release */, 510 | 249021D4217E4FDB00AE95B9 /* Profile */, 511 | ); 512 | defaultConfigurationIsVisible = 0; 513 | defaultConfigurationName = Release; 514 | }; 515 | /* End XCConfigurationList section */ 516 | }; 517 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 518 | } 519 | --------------------------------------------------------------------------------