// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

module mojo.common.test;

import "mojo/common/file.mojom";
import "mojo/common/file_path.mojom";
import "mojo/common/text_direction.mojom";
import "mojo/common/time.mojom";
import "mojo/common/unguessable_token.mojom";
import "mojo/common/values.mojom";

interface TestFilePath {
  BounceFilePath(mojo.common.mojom.FilePath in)
      => (mojo.common.mojom.FilePath out);
};

interface TestUnguessableToken {
  BounceNonce(mojo.common.mojom.UnguessableToken in)
      => (mojo.common.mojom.UnguessableToken out);
};

interface TestTime {
  BounceTime(mojo.common.mojom.Time time) => (mojo.common.mojom.Time time);
  BounceTimeDelta(mojo.common.mojom.TimeDelta time_delta)
      => (mojo.common.mojom.TimeDelta time_delta);
  BounceTimeTicks(mojo.common.mojom.TimeTicks time_ticks)
      => (mojo.common.mojom.TimeTicks time_ticks);
};

interface TestValue {
  [Sync]
  BounceDictionaryValue(mojo.common.mojom.DictionaryValue in)
      => (mojo.common.mojom.DictionaryValue out);
  [Sync]
  BounceListValue(mojo.common.mojom.ListValue in)
      => (mojo.common.mojom.ListValue out);
  [Sync]
  BounceValue(mojo.common.mojom.Value? in)
      => (mojo.common.mojom.Value? out);
};

interface TestFile {
  [Sync]
  BounceFile(mojo.common.mojom.File? in)
      => (mojo.common.mojom.File? out);
};

interface TestTextDirection {
  [Sync]
  BounceTextDirection(mojo.common.mojom.TextDirection in)
      => (mojo.common.mojom.TextDirection out);
};
