class CCK::KeysChecker
def self.compare(detected, expected)
def self.compare(detected, expected) new(detected, expected).compare end
def compare
def compare return [] if identical_keys? errors << "Detected extra keys in message #{message_name}: #{extra_keys}" if extra_keys.any? errors << "Missing keys in message #{message_name}: #{missing_keys}" if missing_keys.any? errors rescue StandardError => e ["Unexpected error: #{e.message}"] end
def detected_keys
def detected_keys @detected_keys ||= ordered_uniq_hash_keys(detected) end
def errors
def errors @errors ||= [] end
def expected_keys
def expected_keys @expected_keys ||= ordered_uniq_hash_keys(expected) end
def extra_keys
def extra_keys (detected_keys - expected_keys).reject { |key| meta_message? && key == :ci } end
def identical_keys?
def identical_keys? detected_keys == expected_keys end
def initialize(detected, expected)
def initialize(detected, expected) @detected = detected @expected = expected end
def message_name
def message_name detected.class.name end
def meta_message?
def meta_message? detected.instance_of?(Cucumber::Messages::Meta) end
def missing_keys
def missing_keys (expected_keys - detected_keys).reject { |key| meta_message? && key == :ci } end
def ordered_uniq_hash_keys(object)
def ordered_uniq_hash_keys(object) object.to_h(reject_nil_values: true).keys.sort end