2017-12-08 14 views
1

많은 어댑터가있는 C++ 라이브러리를 작성하고 있습니다. 자동 테스트를 작성하는 것은 쉽습니다. 어댑터 foo를 유형 A에 적용 할 수 있습니다. 코드 foo를 작성하고 컴파일하는 것을 확인하십시오. 확신을 가지기 위해 의도 한대로 작동하는지 확인할 수도 있습니다.)이를 지원하는 많은 단위 테스트 프레임 워크가 있습니다.컴파일러에서 받아 들여서는 안되는 것을 테스트하는 방법

그러나 foo가 b 유형을 허용해서는 안되는 것과 같이 특정 사항은 컴파일하지 않는 것이 중요합니다. 자동화 된 방법으로이를 테스트하는 것에 대한 공통된 인식이 있습니까? 한 단계는 컴파일러를 실행하여 오류 상태를 반환하는지 (또는 출력 파일을 생성하지 않는지) 확인하는 것입니다. 그러나 그것은 테스트 당 하나의 소스 파일을 필요로합니다! 일부 매크로 매직은 테스트를 하나의 소스 파일로 결합 할 수 있지만 여전히 많은 컴파일이 필요합니다.

나는이 문제로 어려움을 겪은 첫 사람이라고 생각하지 않습니다. 그런 테스트를 구성하고 실행하는 좋은 방법은 무엇입니까?

(전례에서 컴파일러가 오류 코드 을 반환하는 명령 줄 옵션 -fail 12가있는 작은 컴파일러를 작성했습니다.에 오류 또는 12 행이 없으면 GCC를 패치해야합니다. 비슷한 것을 받아 들여라.)

답변

0

나는 제한된 방법으로 C++ 개념으로 할 수있는 것으로 밝혀졌다. 개념은 해당 절이 올바른 형식인지 여부를 테스트합니다. 그렇지 않은 경우 개념은 false를 반환합니다. 이 코드는 pin_in_out에 set (bool) 함수가 있는지 확인하고 pin_in은 해당 함수를 호출하지 않습니다.

struct pin_in_out { static void set(bool v){} }; 
struct pin_in{ }; 

template< typename T > 
concept bool test_case = requires(bool v) { 
    { T::set(v) } -> void; 
}; 

int main(){ 
    std::cout << test_case<pin_in_out> << "\n"; 
    std::cout << test_case<pin_in> << "\n"; 
} 

인쇄

1 
0 

필요한 코드는 자세한 조금 (각 테스트는 별도의 conecpt 필요), 그래서 아마 파이썬 testcript - 투 - C++ 번역기를 쓸 것이다.