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

/// Mustache template used for generating README.md.
String readmeTemplate = """
# Imitation Game

## Description

`imitation_game` is a platform for performing automated tests to compare the
performance of different UI frameworks.  For example, how much memory does the
same app written in Flutter and UIKit take?

## Running all the tests

You need a mobile device plugged into your computer and setup for development.
The mobile device and the computer need to be on the same network, one that
allows communication between computers since that's how the mobile phone will
report its results to the computer.

```sh
dart imitation_game.dart
```

## Dependencies

In order to run the tests you will need the union of all the platforms being
tested.  As new tests are added please add to this list:

### iOS

- Flutter
- Xcode
- [ios_deploy](https://github.com/ios-control/ios-deploy) - used to launch apps
  on the attached iOS device.

## Example File Layout

```text
./
├─ imitation_game.dart
└─ imitation_tests/
   ├─ smiley/
   │  ├─ README.md
   │  ├─ flutter/
   │  │  ├─ run_ios.sh
   │  │  └─ <flutter project files>
   │  └─ uikit/
   │     ├─ run_ios.sh
   │     └─ <uikit project files>
   └─ memory/
      ├─ README.md
      ├─ flutter/
      │  ├─ run_ios.sh
      │  └─ <flutter project files>
      └─ uikit/
         ├─ run_ios.sh
         └─ <uikit project files>
```

Here there are 2 different tests with 2 different platform implementations.  The
tests are named `smiley` and `memory`, they are both implemented on the
platforms `flutter` and `uikit`.

### Adding a test

Tests should comprise of implementations on one or more platform.  The directory
for the test should be added to `./tests`.  Inside that directory there should
be a directory of implementations and a `README.md` file that explains the test.

### Adding an implementation to a test

An implementation has to follow these rules:

- It needs to perform the same operations as the other implementations and
  follow the description in the test's `README.md`.
- It needs to contain a `run_ios.sh` script that will build and launch the test
  on the connected device.
- It should contain a file named `ip.txt` which will be overwritten by
  `imitation_game.dart` with the ip address and port that should be used to
  report results to.
- It needs to report its results to the ip and port in the `ip.txt` via an HTTP
  POST of JSON data.

## Data format for results

```json
{
  "test": "name_of_test",
  "platform": "name_of_platform",
  "results": {
    "some_result_name": 1.23,
    "some_result_name2": 4.56,
  }
}
```

A single test run can report multiple numbers.

## Results
Date created: {{date}}
{{flutterVersion}}

{{#tests}}
- {{name}}
  {{#platforms}}
    - {{name}}
    {{#measurements}}
      - {{name}}: {{value}}
    {{/measurements}}
  {{/platforms}}
{{/tests}}

""";
