// test_workflow_generator.cc // Implementation of natural language to test workflow conversion #include "cli/service/test_workflow_generator.h" #include "absl/strings/ascii.h" #include "absl/strings/match.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" #include "absl/strings/str_replace.h" #include namespace yaze { namespace cli { std::string TestStep::ToString() const { switch (type) { case TestStepType::kClick: return absl::StrFormat("Click(%s)", target); case TestStepType::kType: return absl::StrFormat("Type(%s, \"%s\"%s)", target, text, clear_first ? ", clear_first" : ""); case TestStepType::kWait: return absl::StrFormat("Wait(%s, %dms)", condition, timeout_ms); case TestStepType::kAssert: return absl::StrFormat("Assert(%s)", condition); case TestStepType::kScreenshot: return "Screenshot()"; } return "Unknown"; } std::string TestWorkflow::ToString() const { std::string result = absl::StrCat("Workflow: ", description, "\n"); for (size_t i = 0; i < steps.size(); ++i) { absl::StrAppend(&result, " ", i + 1, ". ", steps[i].ToString(), "\n"); } return result; } absl::StatusOr TestWorkflowGenerator::GenerateWorkflow( const std::string& prompt) { std::string normalized_prompt = absl::AsciiStrToLower(prompt); // Try pattern matching in order of specificity std::string editor_name, input_name, text, button_name; // Pattern 1: "Open and verify it loads" if (MatchesOpenAndVerify(normalized_prompt, &editor_name)) { return BuildOpenAndVerifyWorkflow(editor_name); } // Pattern 2: "Open editor" if (MatchesOpenEditor(normalized_prompt, &editor_name)) { return BuildOpenEditorWorkflow(editor_name); } // Pattern 3: "Type '' in " if (MatchesTypeInput(normalized_prompt, &input_name, &text)) { return BuildTypeInputWorkflow(input_name, text); } // Pattern 4: "Click