snippets_test.dart 7.06 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5
import 'dart:convert';
6 7
import 'dart:io' hide Platform;

8
import 'package:path/path.dart' as path;
9 10
import 'package:snippets/configuration.dart';
import 'package:snippets/snippets.dart';
11
import 'package:test/test.dart' hide TypeMatcher, isInstanceOf;
12 13 14

void main() {
  group('Generator', () {
15 16 17 18
    late Configuration configuration;
    late SnippetGenerator generator;
    late Directory tmpDir;
    late File template;
19 20

    setUp(() {
21
      tmpDir = Directory.systemTemp.createTempSync('flutter_snippets_test.');
22 23
      configuration = Configuration(flutterRoot: Directory(path.join(
          tmpDir.absolute.path, 'flutter')));
24 25 26 27 28
      configuration.createOutputDirectory();
      configuration.templatesDirectory.createSync(recursive: true);
      configuration.skeletonsDirectory.createSync(recursive: true);
      template = File(path.join(configuration.templatesDirectory.path, 'template.tmpl'));
      template.writeAsStringSync('''
29
// Flutter code sample for {{element}}
30 31 32

{{description}}

33 34 35 36 37
import 'package:flutter/material.dart';
import '../foo.dart';

{{code-imports}}

38
{{code-my-preamble}}
39 40 41 42 43

main() {
  {{code}}
}
''');
44
      configuration.getHtmlSkeletonFile(SnippetType.sample).writeAsStringSync('''
45 46 47 48 49 50
<div>HTML Bits</div>
{{description}}
<pre>{{code}}</pre>
<pre>{{app}}</pre>
<div>More HTML Bits</div>
''');
51
      configuration.getHtmlSkeletonFile(SnippetType.snippet).writeAsStringSync('''
52 53 54 55
<div>HTML Bits</div>
{{description}}
<pre>{{code}}</pre>
<div>More HTML Bits</div>
56
''');
57
      configuration.getHtmlSkeletonFile(SnippetType.sample, showDartPad: true).writeAsStringSync('''
58
<div>HTML Bits (DartPad-style)</div>
59
<iframe class="snippet-dartpad" src="https://dartpad.dev/embed-flutter.html?split=60&run=true&sample_id={{id}}&sample_channel={{channel}}"></iframe>
60
<div>More HTML Bits</div>
61 62 63 64 65 66 67
''');
      generator = SnippetGenerator(configuration: configuration);
    });
    tearDown(() {
      tmpDir.deleteSync(recursive: true);
    });

68
    test('generates samples', () async {
69 70
      final File inputFile = File(path.join(tmpDir.absolute.path, 'snippet_in.txt'))
        ..createSync(recursive: true)
71
        ..writeAsStringSync(r'''
72 73 74 75
A description of the snippet.

On several lines.

76 77 78 79
```dart imports
import 'dart:ui';
```

80
```my-dart_language my-preamble
81 82 83 84 85
const String name = 'snippet';
```

```dart
void main() {
86
  print('The actual $name.');
87 88 89
}
```
''');
90
      final File outputFile = File(path.join(tmpDir.absolute.path, 'snippet_out.txt'));
91

92 93
      final String html = generator.generate(
        inputFile,
94
        SnippetType.sample,
95 96 97
        template: 'template',
        metadata: <String, Object>{
          'id': 'id',
98
          'channel': 'stable',
99
          'element': 'MyElement',
100
        },
101
        output: outputFile,
102
      );
103 104
      expect(html, contains('<div>HTML Bits</div>'));
      expect(html, contains('<div>More HTML Bits</div>'));
105
      expect(html, contains(r'print(&#39;The actual $name.&#39;);'));
106
      expect(html, contains('A description of the snippet.\n'));
107
      expect(html, isNot(contains('sample_channel=stable')));
108 109
      expect(
          html,
110 111 112
          contains('&#47;&#47; A description of the snippet.\n'
              '&#47;&#47;\n'
              '&#47;&#47; On several lines.\n'));
113
      expect(html, contains('void main() {'));
114 115 116 117 118 119

      final String outputContents = outputFile.readAsStringSync();
      expect(outputContents, contains('// Flutter code sample for MyElement'));
      expect(outputContents, contains('A description of the snippet.'));
      expect(outputContents, contains('void main() {'));
      expect(outputContents, contains("const String name = 'snippet';"));
120 121 122 123 124 125
      final List<String> lines = outputContents.split('\n');
      final int dartUiLine = lines.indexOf("import 'dart:ui';");
      final int materialLine = lines.indexOf("import 'package:flutter/material.dart';");
      final int otherLine = lines.indexOf("import '../foo.dart';");
      expect(dartUiLine, lessThan(materialLine));
      expect(materialLine, lessThan(otherLine));
126 127
    });

128
    test('generates snippets', () async {
129 130
      final File inputFile = File(path.join(tmpDir.absolute.path, 'snippet_in.txt'))
        ..createSync(recursive: true)
131
        ..writeAsStringSync(r'''
132 133 134 135 136 137
A description of the snippet.

On several lines.

```code
void main() {
138
  print('The actual $name.');
139 140 141 142
}
```
''');

143 144
      final String html = generator.generate(
        inputFile,
145
        SnippetType.snippet,
146 147
        metadata: <String, Object>{'id': 'id'},
      );
148 149
      expect(html, contains('<div>HTML Bits</div>'));
      expect(html, contains('<div>More HTML Bits</div>'));
150
      expect(html, contains(r'  print(&#39;The actual $name.&#39;);'));
151
      expect(html, contains('<div class="snippet-description">{@end-inject-html}A description of the snippet.\n\n'
152
          'On several lines.{@inject-html}</div>\n'));
153 154
      expect(html, contains('main() {'));
    });
155

156
    test('generates dartpad samples', () async {
157 158
      final File inputFile = File(path.join(tmpDir.absolute.path, 'snippet_in.txt'))
        ..createSync(recursive: true)
159
        ..writeAsStringSync(r'''
160 161 162 163 164 165
A description of the snippet.

On several lines.

```code
void main() {
166
  print('The actual $name.');
167 168 169 170 171 172
}
```
''');

      final String html = generator.generate(
        inputFile,
173
        SnippetType.sample,
174 175
        showDartPad: true,
        template: 'template',
176
        metadata: <String, Object>{'id': 'id', 'channel': 'stable'},
177 178 179
      );
      expect(html, contains('<div>HTML Bits (DartPad-style)</div>'));
      expect(html, contains('<div>More HTML Bits</div>'));
180
      expect(html, contains('<iframe class="snippet-dartpad" src="https://dartpad.dev/embed-flutter.html?split=60&run=true&sample_id=id&sample_channel=stable"></iframe>'));
181 182
    });

183
    test('generates sample metadata', () async {
184 185
      final File inputFile = File(path.join(tmpDir.absolute.path, 'snippet_in.txt'))
        ..createSync(recursive: true)
186
        ..writeAsStringSync(r'''
187 188 189 190 191 192
A description of the snippet.

On several lines.

```code
void main() {
193
  print('The actual $name.');
194 195 196 197 198 199 200 201 202
}
```
''');

      final File outputFile = File(path.join(tmpDir.absolute.path, 'snippet_out.dart'));
      final File expectedMetadataFile = File(path.join(tmpDir.absolute.path, 'snippet_out.json'));

      generator.generate(
        inputFile,
203
        SnippetType.sample,
204 205
        template: 'template',
        output: outputFile,
206
        metadata: <String, Object>{'sourcePath': 'some/path.dart', 'id': 'id', 'channel': 'stable'},
207 208
      );
      expect(expectedMetadataFile.existsSync(), isTrue);
209
      final Map<String, dynamic> json = jsonDecode(expectedMetadataFile.readAsStringSync()) as Map<String, dynamic>;
210
      expect(json['id'], equals('id'));
211
      expect(json['channel'], equals('stable'));
212 213 214 215 216
      expect(json['file'], equals('snippet_out.dart'));
      expect(json['description'], equals('A description of the snippet.\n\nOn several lines.'));
      // Ensure any passed metadata is included in the output JSON too.
      expect(json['sourcePath'], equals('some/path.dart'));
    });
217 218
  });
}