Browse Source

Add prompt system for reading values using ostream >> T

Sam Jaffe 5 năm trước cách đây
mục cha
commit
e4ba7c7b56
4 tập tin đã thay đổi với 34 bổ sung13 xóa
  1. 0 4
      cli.xcodeproj/project.pbxproj
  2. 18 0
      include/cli/prompt.h
  3. 0 9
      src/prompt.cxx
  4. 16 0
      test/prompt_test.cxx

+ 0 - 4
cli.xcodeproj/project.pbxproj

@@ -13,7 +13,6 @@
 		CDC748E925313D81008D9D1D /* GoogleMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CDC748B425313553008D9D1D /* GoogleMock.framework */; };
 		CDC748F4253141AF008D9D1D /* libstring-utils.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CDC748F125314196008D9D1D /* libstring-utils.a */; };
 		CDF978A525323ADB00204B5C /* prompt_test.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CDF978A425323ADB00204B5C /* prompt_test.cxx */; };
-		CDF978A725323BFF00204B5C /* prompt.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CDF978A625323BFF00204B5C /* prompt.cxx */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -78,7 +77,6 @@
 		CDC748E625313CBC008D9D1D /* cli_test.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = cli_test.cxx; sourceTree = "<group>"; };
 		CDC748EA25314195008D9D1D /* string-utils.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "string-utils.xcodeproj"; path = "external/string-utils/string-utils.xcodeproj"; sourceTree = "<group>"; };
 		CDF978A425323ADB00204B5C /* prompt_test.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = prompt_test.cxx; sourceTree = "<group>"; };
-		CDF978A625323BFF00204B5C /* prompt.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = prompt.cxx; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -140,7 +138,6 @@
 			isa = PBXGroup;
 			children = (
 				CDC748E2253136FD008D9D1D /* cli.cxx */,
-				CDF978A625323BFF00204B5C /* prompt.cxx */,
 			);
 			path = src;
 			sourceTree = "<group>";
@@ -333,7 +330,6 @@
 			buildActionMask = 2147483647;
 			files = (
 				CDC748E5253136FD008D9D1D /* cli.cxx in Sources */,
-				CDF978A725323BFF00204B5C /* prompt.cxx in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

+ 18 - 0
include/cli/prompt.h

@@ -8,7 +8,9 @@
 
 #pragma once
 
+#include <iostream>
 #include <memory>
+#include <sstream>
 
 #include "message.h"
 
@@ -22,6 +24,22 @@ public:
   template <typename ...Args>
   prompt(Args &&...args)
       : input_prompt_(make_message(std::forward<Args>(args)...)) {}
+  
+  template <typename T> T read(std::istream & in = std::cin) const {
+    T rval{};
+    while (true) {
+      input_prompt_->print(std::cout);
+      std::string data;
+      if (!std::getline(in, data, '\n') || data.empty()) {
+        break;
+      }
+      std::stringstream ss{data};
+      if (ss >> rval) {
+        break;
+      }
+    };
+    return rval;
+  }
 };
 
 }

+ 0 - 9
src/prompt.cxx

@@ -1,9 +0,0 @@
-//
-//  prompt.cxx
-//  cli
-//
-//  Created by Sam Jaffe on 10/10/20.
-//  Copyright © 2020 Sam Jaffe. All rights reserved.
-//
-
-#include "cli/prompt.h"

+ 16 - 0
test/prompt_test.cxx

@@ -28,3 +28,19 @@ TEST(PromptTest, WillOutputEverythingInMessageWithNoSpaces) {
   msg->print(out);
   EXPECT_THAT(out.str(), "Example1true");
 }
+
+TEST(PromptTest, WillRepollIfBadDataProvided) {
+  std::stringstream in{"cake\n1"};
+  cli::prompt prompt;
+  
+  int i = prompt.read<int>(in);
+  EXPECT_THAT(i, 1);
+}
+
+TEST(PromptTest, WillDiscardEntireLineOnFailedParse) {
+  std::stringstream in{"cake 2\n1"};
+  cli::prompt prompt;
+  
+  int i = prompt.read<int>(in);
+  EXPECT_THAT(i, 1);
+}