// Copyright 2014 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.

#ifndef COBALT_MEDIA_CAST_TEST_UTILITY_INPUT_BUILDER_H_
#define COBALT_MEDIA_CAST_TEST_UTILITY_INPUT_BUILDER_H_

#include <limits.h>

#include <string>

namespace media {
namespace cast {
namespace test {

// This class handles general user input to the application. The user will be
// displayed with the title string and be given a default value. When forced
// a range, the input values should be within low_range to high_range.
// Setting low and high to INT_MIN/INT_MAX is equivalent to not setting a range.
class InputBuilder {
 public:
  InputBuilder(const std::string& title,
               const std::string& default_value,
               int low_range,
               int high_range);
  virtual ~InputBuilder();

  // Ask the user for input, reads input from the input source and returns
  // the answer. This method will keep asking the user until a correct answer
  // is returned and is thereby guaranteed to return a response that is
  // acceptable within the predefined range.
  // Input will be returned in either string or int format, base on the function
  // called.
  std::string GetStringInput() const;
  int GetIntInput() const;

 private:
  bool ValidateInput(const std::string& input) const;

  const std::string title_;
  const std::string default_value_;
  // Low and high range values for input validation.
  const int low_range_;
  const int high_range_;
};

}  // namespace test
}  // namespace cast
}  // namespace media

#endif  // COBALT_MEDIA_CAST_TEST_UTILITY_INPUT_BUILDER_H_
