Я проектирую библиотеку для себя, которая позволяет связывать потоки данных. Позвольте мне нарисовать сценарий:
Я создаю SerialDatastream , который является нижним уровнем и выполняет чтение и запись в COM-порт.
Я передаю указатель на это конструктору ProtocolDatastream , который интерпретирует байты при чтении из последовательного потока данных (хотя он только знает, что он соответствует моему интерфейсу Datastream ) и возвращает их в качестве единиц данных протокола.
Теперь, допустим, я хочу взять информацию с последовательного порта, а также записать ее в байтах за байтами. Я вставляю TeeDatastream в середине, который читает из одного источника, но выводит в два места назначения:
+-----> Log
|
Serial ----> Tee ----> Protocol
TeeDatastream реализован следующим образом: когда операция чтения выполняется из одной ветви, он буферизует данные в переменную-член. Затем, когда операция чтения выполняется в другой ветви, она считывает уже буферизованные данные.
(кстати, работает нормально)
Это означает, что после каждой операции класс должен проверять, существуют ли данные, прочитанные из обеих ветвей. Эти данные затем могут быть отброшены, и, таким образом, буфер уменьшается, а также увеличивается. Однако , это абсолютно невидимо для любого клиента класса. Поэтому мой вопрос: какой шаблон следует использовать для тестирования невидимых, но необходимых частей реализации?