87 lines
3.2 KiB
C++
87 lines
3.2 KiB
C++
|
|
// Step 1934: DAPCapabilityNegotiator
|
||
|
|
//
|
||
|
|
// t1: registerAdapter and supports
|
||
|
|
// t2: supportedCommands returns registered set
|
||
|
|
// t3: languagesFor returns all languages for a command
|
||
|
|
// t4: selectAdapter prefers given language; falls back to first available
|
||
|
|
// t5: unknown language/command edge cases
|
||
|
|
|
||
|
|
#include "DAPCapabilityNegotiator.h"
|
||
|
|
#include <algorithm>
|
||
|
|
#include <iostream>
|
||
|
|
|
||
|
|
namespace ws = whetstone;
|
||
|
|
static int p=0,f=0;
|
||
|
|
#define T(n) { std::cout<<" "<<#n<<"... "; }
|
||
|
|
#define P() { std::cout<<"PASS\n"; ++p; }
|
||
|
|
#define F(m) { std::cout<<"FAIL: "<<m<<"\n"; ++f; }
|
||
|
|
#define C(c,m) if(!(c)){F(m);return;}
|
||
|
|
|
||
|
|
void t1(){
|
||
|
|
T(registerAdapter_and_supports);
|
||
|
|
ws::DAPCapabilityNegotiator n;
|
||
|
|
n.registerAdapter("Python", {"stackTrace","stepIn","next"});
|
||
|
|
n.registerAdapter("Rust", {"stackTrace","next"});
|
||
|
|
C( n.supports("Python","stackTrace"), "Python stackTrace");
|
||
|
|
C( n.supports("Python","stepIn"), "Python stepIn");
|
||
|
|
C(!n.supports("Rust", "stepIn"), "Rust no stepIn");
|
||
|
|
C( n.supports("Rust", "next"), "Rust next");
|
||
|
|
P();
|
||
|
|
}
|
||
|
|
|
||
|
|
void t2(){
|
||
|
|
T(supportedCommands_returns_set);
|
||
|
|
ws::DAPCapabilityNegotiator n;
|
||
|
|
n.registerAdapter("Go", {"stackTrace","continue","stepIn"});
|
||
|
|
auto cmds = n.supportedCommands("Go");
|
||
|
|
C(cmds.size() == 3, "three commands");
|
||
|
|
C(std::find(cmds.begin(),cmds.end(),"stepIn") != cmds.end(), "stepIn present");
|
||
|
|
C(n.supportedCommands("Unknown").empty(), "unknown lang empty");
|
||
|
|
P();
|
||
|
|
}
|
||
|
|
|
||
|
|
void t3(){
|
||
|
|
T(languagesFor_all_supporting_languages);
|
||
|
|
ws::DAPCapabilityNegotiator n;
|
||
|
|
n.registerAdapter("Python", {"stackTrace","stepIn"});
|
||
|
|
n.registerAdapter("Rust", {"stackTrace","next"});
|
||
|
|
n.registerAdapter("TypeScript", {"stackTrace","stepIn","next"});
|
||
|
|
auto langsStack = n.languagesFor("stackTrace");
|
||
|
|
C(langsStack.size() == 3, "three langs for stackTrace");
|
||
|
|
auto langsStep = n.languagesFor("stepIn");
|
||
|
|
C(langsStep.size() == 2, "two langs for stepIn");
|
||
|
|
C(n.languagesFor("pause").empty(), "none for pause");
|
||
|
|
P();
|
||
|
|
}
|
||
|
|
|
||
|
|
void t4(){
|
||
|
|
T(selectAdapter_preferred_or_fallback);
|
||
|
|
ws::DAPCapabilityNegotiator n;
|
||
|
|
n.registerAdapter("Python", {"stackTrace","stepIn"});
|
||
|
|
n.registerAdapter("Rust", {"stackTrace","next"});
|
||
|
|
// preferred supports it
|
||
|
|
C(n.selectAdapter("stepIn", "Python") == "Python", "preferred Python for stepIn");
|
||
|
|
// preferred doesn't support, fallback to first that does
|
||
|
|
C(n.selectAdapter("next", "Python") == "Rust", "fallback Rust for next");
|
||
|
|
// preferred doesn't exist, fallback
|
||
|
|
C(n.selectAdapter("stackTrace","Go") != "", "fallback for unknown lang");
|
||
|
|
P();
|
||
|
|
}
|
||
|
|
|
||
|
|
void t5(){
|
||
|
|
T(unknown_language_and_command_edge_cases);
|
||
|
|
ws::DAPCapabilityNegotiator n;
|
||
|
|
n.registerAdapter("Go", {"continue"});
|
||
|
|
C(!n.supports("Unknown","continue"), "unknown lang not supported");
|
||
|
|
C( n.selectAdapter("pause","Go") == "", "no lang for unknown cmd");
|
||
|
|
C(!n.supports("Go","pause"), "Go no pause");
|
||
|
|
P();
|
||
|
|
}
|
||
|
|
|
||
|
|
int main(){
|
||
|
|
std::cout << "Step 1934: DAPCapabilityNegotiator\n";
|
||
|
|
t1(); t2(); t3(); t4(); t5();
|
||
|
|
std::cout << "\n" << p << "/" << (p+f) << " passed\n";
|
||
|
|
return f > 0 ? 1 : 0;
|
||
|
|
}
|