// 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/string16.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 TestString16 {
  [Sync]
  BounceString16(mojo.common.mojom.String16 in)
      => (mojo.common.mojom.String16 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);
};
