snippets_test.dart 6.55 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 8
import 'dart:io' hide Platform;
import 'package:path/path.dart' as path;

9
import 'package:test/test.dart' hide TypeMatcher, isInstanceOf;
10 11 12 13 14 15 16 17 18 19 20 21

import 'package:snippets/configuration.dart';
import 'package:snippets/snippets.dart';

void main() {
  group('Generator', () {
    Configuration configuration;
    SnippetGenerator generator;
    Directory tmpDir;
    File template;

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

{{description}}

34
{{code-my-preamble}}
35 36 37 38 39

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

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

On several lines.

72
```my-dart_language my-preamble
73 74 75 76 77
const String name = 'snippet';
```

```dart
void main() {
78
  print('The actual $name.');
79 80 81
}
```
''');
82
      final File outputFile = File(path.join(tmpDir.absolute.path, 'snippet_out.txt'));
83

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

      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';"));
112 113
    });

114
    test('generates snippets', () async {
115 116
      final File inputFile = File(path.join(tmpDir.absolute.path, 'snippet_in.txt'))
        ..createSync(recursive: true)
117
        ..writeAsStringSync(r'''
118 119 120 121 122 123
A description of the snippet.

On several lines.

```code
void main() {
124
  print('The actual $name.');
125 126 127 128
}
```
''');

129 130
      final String html = generator.generate(
        inputFile,
131
        SnippetType.snippet,
132 133
        metadata: <String, Object>{'id': 'id'},
      );
134 135
      expect(html, contains('<div>HTML Bits</div>'));
      expect(html, contains('<div>More HTML Bits</div>'));
136
      expect(html, contains(r'  print(&#39;The actual $name.&#39;);'));
137
      expect(html, contains('<div class="snippet-description">{@end-inject-html}A description of the snippet.\n\n'
138
          'On several lines.{@inject-html}</div>\n'));
139 140
      expect(html, contains('main() {'));
    });
141

142
    test('generates dartpad samples', () async {
143 144
      final File inputFile = File(path.join(tmpDir.absolute.path, 'snippet_in.txt'))
        ..createSync(recursive: true)
145
        ..writeAsStringSync(r'''
146 147 148 149 150 151
A description of the snippet.

On several lines.

```code
void main() {
152
  print('The actual $name.');
153 154 155 156 157 158
}
```
''');

      final String html = generator.generate(
        inputFile,
159
        SnippetType.sample,
160 161
        showDartPad: true,
        template: 'template',
162
        metadata: <String, Object>{'id': 'id', 'channel': 'stable'},
163 164 165
      );
      expect(html, contains('<div>HTML Bits (DartPad-style)</div>'));
      expect(html, contains('<div>More HTML Bits</div>'));
166
      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>'));
167 168
    });

169
    test('generates sample metadata', () async {
170 171
      final File inputFile = File(path.join(tmpDir.absolute.path, 'snippet_in.txt'))
        ..createSync(recursive: true)
172
        ..writeAsStringSync(r'''
173 174 175 176 177 178
A description of the snippet.

On several lines.

```code
void main() {
179
  print('The actual $name.');
180 181 182 183 184 185 186 187 188
}
```
''');

      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,
189
        SnippetType.sample,
190 191
        template: 'template',
        output: outputFile,
192
        metadata: <String, Object>{'sourcePath': 'some/path.dart', 'id': 'id', 'channel': 'stable'},
193 194
      );
      expect(expectedMetadataFile.existsSync(), isTrue);
195
      final Map<String, dynamic> json = jsonDecode(expectedMetadataFile.readAsStringSync()) as Map<String, dynamic>;
196
      expect(json['id'], equals('id'));
197
      expect(json['channel'], equals('stable'));
198 199 200 201 202
      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'));
    });
203 204
  });
}