// Copyright 2018 Google Inc. Use of this source code is governed by an
// MIT-style license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT.

import 'package:test/test.dart';

import 'package:sass/sass.dart';
import 'package:sass/src/exception.dart';

/// Parses [source] by way of a function call.
Value parseValue(String source) {
  late Value value;
  compileString(
    """
      @use "sass:list";
      @use "sass:math";

      a {b: foo(($source))}
    """,
    functions: [
      Callable(
        "foo",
        r"$arg",
        expectAsync1((arguments) {
          expect(arguments, hasLength(1));
          value = arguments.first;
          return sassNull;
        }),
      ),
    ],
  );
  return value;
}

/// A matcher that asserts that a function throws a [SassScriptException].
final throwsSassScriptException = throwsA(
  const TypeMatcher<SassScriptException>(),
);

/// Like [equals], but asserts that the hash codes of the values are the same as
/// well.
Matcher equalsWithHash(Object expected) => predicate((actual) {
      expect(actual, equals(expected));
      expect(
        actual.hashCode,
        equals(expected.hashCode),
        reason: "Expected $actual's hash code to equal $expected's.",
      );
      return true;
    });
