blob: 878c41c49f7157d7461f3797c0f5ed32168cacd6 [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:js_interop';
import 'package:expect/expect.dart';
@JS()
external void eval(String code);
@JS('Constraint')
@staticInterop
abstract class ConstraintJsImpl {}
@JS('Query')
@staticInterop
abstract class QueryJsImpl {}
@JS('query')
external QueryJsImpl queryRaw(QueryJsImpl q, ConstraintJsImpl c);
@JS('createConstraint')
external ConstraintJsImpl createConstraintRaw(JSString name);
abstract class JsWrapper<T extends Object> {
final T jsObject;
JsWrapper(this.jsObject);
}
class Query<T extends QueryJsImpl> extends JsWrapper<T> {
Query(super.jsObject);
ConstraintJsImpl _createConstraint(String name) {
return createConstraintRaw(name.toJS);
}
Query filter(String name) {
return Query(queryRaw(jsObject, _createConstraint(name)));
}
}
class SubQuery<T extends QueryJsImpl> extends Query<T> {
SubQuery(super.jsObject);
}
void main() {
eval(r'''
globalThis.createConstraint = function(name) {
return { kind: "constraint", name: name };
};
globalThis.query = function(q, c) {
return { kind: "query", base: q, constraint: c };
};
globalThis.rootQuery = { kind: "root" };
''');
eval(r'''
globalThis.getRootQuery = function() {
return globalThis.rootQuery;
};
''');
final root = SubQuery<QueryJsImpl>(_getRootQuery());
final filtered = root.filter('test');
Expect.isNotNull(filtered);
}
@JS('getRootQuery')
external QueryJsImpl _getRootQuery();