// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'package:test/test.dart';

import '../../../tool/lsp_spec/markdown.dart';

main() {
  group('markdown parser', () {
    test('extracts a typescript fenced block from Markdown', () {
      final String input = '''
```typescript
CONTENT
```
    ''';
      final List<String> output = extractTypeScriptBlocks(input);
      expect(output, hasLength(1));
      expect(output, contains('CONTENT'));
    });

    test('does not extract unknown code blocks', () {
      final String input = '''
```
CONTENT
```

```dart
CONTENT
```
    ''';
      final List<String> output = extractTypeScriptBlocks(input);
      expect(output, hasLength(0));
    });

    test('extracts multiple code blocks', () {
      final String input = '''
```typescript
CONTENT1
```

```typescript
CONTENT2
```
    ''';
      final List<String> output = extractTypeScriptBlocks(input);
      expect(output, hasLength(2));
      expect(output, contains('CONTENT1'));
      expect(output, contains('CONTENT2'));
    });
  });
}
