1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "webrtc/video_engine/test/auto_test/primitives/choice_helpers.h"
12
13 #include <assert.h>
14 #include <stdio.h>
15 #include <stdlib.h>
16
17 #include <algorithm>
18 #include <sstream>
19
20 namespace webrtc {
21
ChoiceBuilder(const std::string & title,const Choices & choices)22 ChoiceBuilder::ChoiceBuilder(const std::string& title, const Choices& choices)
23 : choices_(choices),
24 input_helper_(TypedInput(title)) {
25 input_helper_.WithInputValidator(
26 new IntegerWithinRangeValidator(1, choices.size()));
27 input_helper_.WithAdditionalInfo(MakeHumanReadableOptions());
28 }
29
Choose()30 int ChoiceBuilder::Choose() {
31 std::string input = input_helper_.AskForInput();
32 return atoi(input.c_str());
33 }
34
WithDefault(const std::string & default_choice)35 ChoiceBuilder& ChoiceBuilder::WithDefault(const std::string& default_choice) {
36 Choices::const_iterator iterator = std::find(
37 choices_.begin(), choices_.end(), default_choice);
38 assert(iterator != choices_.end() && "No such choice.");
39
40 // Store the value as the choice number, e.g. its index + 1.
41 int choice_index = (iterator - choices_.begin()) + 1;
42 char number[16];
43 sprintf(number, "%d", choice_index);
44
45 input_helper_.WithDefault(number);
46 return *this;
47 }
48
WithInputSource(FILE * input_source)49 ChoiceBuilder& ChoiceBuilder::WithInputSource(FILE* input_source) {
50 input_helper_.WithInputSource(input_source);
51 return *this;
52 }
53
MakeHumanReadableOptions()54 std::string ChoiceBuilder::MakeHumanReadableOptions() {
55 std::string result = "";
56 Choices::const_iterator iterator = choices_.begin();
57 for (int number = 1; iterator != choices_.end(); ++iterator, ++number) {
58 std::ostringstream os;
59 os << "\n " << number << ". " << (*iterator).c_str();
60 result += os.str();
61 }
62 return result;
63 }
64
SplitChoices(const std::string & raw_choices)65 Choices SplitChoices(const std::string& raw_choices) {
66 return Split(raw_choices, "\n");
67 }
68
FromChoices(const std::string & title,const std::string & raw_choices)69 ChoiceBuilder FromChoices(
70 const std::string& title, const std::string& raw_choices) {
71 return ChoiceBuilder(title, SplitChoices(raw_choices));
72 }
73
74 } // namespace webrtc
75