/*
 *  Copyright 2017 The WebRTC Project Authors. All rights reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#import <Foundation/Foundation.h>
#import <XCTest/XCTest.h>

#import "WebRTC/RTCSessionDescription.h"

#import "ARDSDPUtils.h"

@interface ARDSDPUtilsTest : XCTestCase
@end

@implementation ARDSDPUtilsTest

- (void)testPreferVideoCodecH264 {
  NSString *sdp = @("m=video 9 RTP/SAVPF 100 116 117 96 120 97\r\n"
                    "a=rtpmap:120 H264/90000\r\n"
                    "a=rtpmap:97 H264/90000\r\n");
  NSString *expectedSdp = @("m=video 9 RTP/SAVPF 120 97 100 116 117 96\r\n"
                            "a=rtpmap:120 H264/90000\r\n"
                            "a=rtpmap:97 H264/90000\r\n");
  [self preferVideoCodec:@"H264" sdp:sdp expected:expectedSdp];
}

- (void)testPreferVideoCodecVP8 {
  NSString *sdp = @("m=video 9 RTP/SAVPF 100 116 117 96 120 97\r\n"
                    "a=rtpmap:116 VP8/90000\r\n");
  NSString *expectedSdp = @("m=video 9 RTP/SAVPF 116 100 117 96 120 97\r\n"
                            "a=rtpmap:116 VP8/90000\r\n");
  [self preferVideoCodec:@"VP8" sdp:sdp expected:expectedSdp];
}

- (void)testNoMLine {
  NSString *sdp = @("a=rtpmap:116 VP8/90000\r\n");
  [self preferVideoCodec:@"VP8" sdp:sdp expected:sdp];
}

- (void)testMissingCodec {
  NSString *sdp = @("m=video 9 RTP/SAVPF 100 116 117 96 120 97\r\n"
                    "a=rtpmap:116 VP8/90000\r\n");
  [self preferVideoCodec:@"foo" sdp:sdp expected:sdp];
}

#pragma mark - Helpers

- (void)preferVideoCodec:(NSString *)codec
                     sdp:(NSString *)sdp
                expected:(NSString *)expectedSdp{
  RTCSessionDescription* desc =
    [[RTCSessionDescription alloc] initWithType:RTCSdpTypeOffer sdp:sdp];
  RTCSessionDescription *outputDesc =
    [ARDSDPUtils descriptionForDescription:desc
                       preferredVideoCodec:codec];
  XCTAssertTrue([outputDesc.description rangeOfString:expectedSdp].location != NSNotFound);
}
@end
