blob: 843682a2230e804d273e4f68a389999057ac3ea7 [file] [edit]
// Copyright (c) 2026, 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 'dart:async';
import 'package:analyzer/file_system/file_system.dart';
import 'package:async/async.dart';
import 'package:checks/checks.dart';
import 'package:checks/context.dart';
import 'package:dartpad_worker/src/shared.dart';
import 'package:json_rpc_2/json_rpc_2.dart' as rpc;
export 'package:checks/checks.dart';
extension ResourceChecks on Subject<Resource> {
void get exists => has((r) => r.exists, 'exists').isTrue();
void get doesNotExist => has((r) => r.exists, 'exists').isFalse();
}
extension FolderChecks on Subject<Folder> {
Subject<File> file(String path) =>
has((f) => f.getFile(path), 'file ($path)');
Subject<Folder> folder(String path) =>
has((f) => f.getFolder(path), 'folder ($path)');
}
extension FileChecks on Subject<File> {
Subject<String> get contents => has((f) => f.readAsStringSync(), 'contents');
}
extension DartPadExceptionChecks on Subject<DartPadException> {
Subject<String> get message => has((e) => e.message, 'message');
}
extension CompileResultChecks on Subject<CompileResult> {
Subject<String?> get code => has((s) => s.code, 'code');
Subject<String> get log => has((s) => s.log, 'log');
Subject<List<String>> get compiledLibraryUris =>
has((s) => s.compiledLibraryUris, 'compiledLibraryUris');
void codeContains(Pattern pattern) => code.isNotNull().contains(pattern);
/// Compilation was successful and logs are empty (indicating no warnings)
void successEmptyLog() {
log.isEmpty();
code.isNotNull();
}
}
extension RpcServerChecks on Subject<rpc.Server> {
/// Check JSON-RPC 2.0 notifications with a stream queue.
Subject<StreamQueue<Object?>> withNotificationQueue(String name) =>
context.nest(() => ['has \'$name\' notification'], (server) {
final c = StreamController<Object?>.broadcast();
server.registerMethod(
name,
(rpc.Parameters params) => c.add(params.value),
);
return Extracted.value(StreamQueue(c.stream));
});
}