Skip to content

phone-number: sync with updated canonical-data.json #112

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 29, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 26 additions & 6 deletions exercises/phone-number/uPhoneNumberExample.pas
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ interface
['{2415B863-E2D7-4E13-BDEF-F7FE9B3E0788}']
function GetCleanNumber: string;
function GetAreaCode: string;
function GetExchangeCode: string;
function ToString: string;
property Clean: string read GetCleanNumber;
property AreaCode: string read GetAreaCode;
property Area: string read GetAreaCode;
property Exchange: string read GetExchangeCode;
end;

function NewPhoneNumber(aPhoneNumber: string): IPhoneNumber;
Expand All @@ -24,18 +26,22 @@ TPhoneNumber = class(TInterfacedObject, IPhoneNumber)
fContainsLetters: TRegex;
fNumber: string;
fAreaCode: string;
fExchangeCode: string;
function GetCleanNumber: string;
function GetAreaCode: string;
function GetExchangeCode: string;
function GetValidatedPhoneNumber(aPhoneNumber: string): string;
function StripOutNonNumerics(aValue: string): string;
function IsInvalidPhoneNumber(aPhoneNumber: string): Boolean;
function GetInvalidPhoneNumberReplacement(aPhoneNumber: string): string;
function IsPhoneNumberwithUSAreaCode(aValue: string): Boolean;
function IsValidCode(aCode: string): Boolean;
public
constructor Create(aPhoneNumber: string);
function ToString: string;
property Clean: string read GetCleanNumber;
property AreaCode: string read GetAreaCode;
property Area: string read GetAreaCode;
property Exchange: string read GetExchangeCode;
end;

function NewPhoneNumber(aPhoneNumber: string): IPhoneNumber;
Expand All @@ -48,17 +54,26 @@ constructor TPhoneNumber.Create(aPhoneNumber: string);
fDigitsOnly := TRegEx.Create('[^\d]');
fContainsLetters := TRegEx.Create('[a-zA-Z]');
fNumber := GetValidatedPhoneNumber(aPhoneNumber);
fAreaCode := fNumber.Substring(0, 3);
if not fNumber.IsEmpty then
begin
fAreaCode := fNumber.Substring(0, 3);
fExchangeCode := fNumber.Substring(3,3);
end;
end;

function TPhoneNumber.GetCleanNumber: string;
begin
result := fNumber;
result := ifthen(IsValidCode(fAreaCode) and IsValidCode(fExchangeCode),fNumber,'');
end;

function TPhoneNumber.GetAreaCode: string;
begin
result := fAreaCode;
result := ifthen(IsValidCode(fAreaCode),fAreaCode,'');
end;

function TPhoneNumber.GetExchangeCode: string;
begin
result := ifthen(IsValidCode(fExchangeCode),fExchangeCode,'');
end;

function TPhoneNumber.GetValidatedPhoneNumber(aPhoneNumber: string):string;
Expand Down Expand Up @@ -94,9 +109,14 @@ function TPhoneNumber.IsPhoneNumberwithUSAreaCode(aValue: string): Boolean;
result := (aValue.Length = 11) and aValue.StartsWith('1');
end;

function TPhoneNumber.IsValidCode(aCode: string): Boolean;
begin
result := (not aCode.IsEmpty) and (aCode[1] in ['2'..'9']);
end;

function TPhoneNumber.ToString: string;
begin
result := Format('(%s) %s-%s',[AreaCode, Clean.Substring(3, 3), Clean.Substring(6)]);
result := Format('(%s) %s-%s',[Area, Exchange, Clean.Substring(6)]);
end;

end.
65 changes: 49 additions & 16 deletions exercises/phone-number/uPhoneNumberTests.pas
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ interface
PhoneNumberTests = class(TObject)
public
[Test]
// [Ignore('Comment the "[Ignore]" statement to run the test')]
// [Ignore('Comment the "[Ignore]" statement to run the test')]
procedure Cleans_the_number;

[Test]
Expand Down Expand Up @@ -55,9 +55,21 @@ PhoneNumberTests = class(TObject)
[Ignore]
procedure Invalid_with_right_number_of_digits_but_letters_mixed_in;

[Test]
[Ignore]
procedure Invalid_if_area_code_does_not_start_with_2_thru_9;

[Test]
[Ignore]
procedure Invalid_if_exchange_code_does_not_start_with_2_thru_9;

[Test]
[Ignore('This is a bonus test')]
procedure Has_an_area_code;
procedure Extract_area_code;

[Test]
[Ignore('This is a bonus test')]
procedure Extract_exchange_code;

[Test]
[Ignore('This is a bonus test')]
Expand All @@ -70,35 +82,35 @@ implementation
procedure PhoneNumberTests.Cleans_the_number;
var phone: IPhoneNumber;
begin
phone := NewPhoneNumber('(123) 456-7890');
assert.AreEqual('1234567890',phone.Clean);
phone := NewPhoneNumber('(223) 456-7890');
assert.AreEqual('2234567890',phone.Clean);
end;

procedure PhoneNumberTests.Cleans_numbers_with_dots;
var phone: IPhoneNumber;
begin
phone := NewPhoneNumber('123.456.7890');
assert.AreEqual('1234567890',phone.Clean);
phone := NewPhoneNumber('223.456.7890');
assert.AreEqual('2234567890',phone.Clean);
end;

procedure PhoneNumberTests.Cleans_numbers_with_multiple_spaces;
var phone: IPhoneNumber;
begin
phone := NewPhoneNumber('123 456 7890 ');
assert.AreEqual('1234567890',phone.Clean);
phone := NewPhoneNumber('223 456 7890 ');
assert.AreEqual('2234567890',phone.Clean);
end;

procedure PhoneNumberTests.Valid_when_11_digits_and_starting_with_1;
var phone: IPhoneNumber;
begin
phone := NewPhoneNumber('11234567890');
assert.AreEqual('1234567890', phone.Clean);
phone := NewPhoneNumber('12234567890');
assert.AreEqual('2234567890', phone.Clean);
end;

procedure PhoneNumberTests.Invalid_when_11_digits_does_not_start_with_a_1;
var phone: IPhoneNumber;
begin
phone := NewPhoneNumber('21234567890');
phone := NewPhoneNumber('22234567890');
assert.AreEqual('', phone.Clean);
end;

Expand Down Expand Up @@ -137,18 +149,39 @@ procedure PhoneNumberTests.Invalid_with_right_number_of_digits_but_letters_mixed
assert.AreEqual('', phone.Clean);
end;

procedure PhoneNumberTests.Has_an_area_code;
procedure PhoneNumberTests.Invalid_if_area_code_does_not_start_with_2_thru_9;
var phone: IPhoneNumber;
begin
phone := NewPhoneNumber('(123) 456-7890');
assert.AreEqual('', phone.Clean);
end;

procedure PhoneNumberTests.Invalid_if_exchange_code_does_not_start_with_2_thru_9;
var phone: IPhoneNumber;
begin
phone := NewPhoneNumber('(223) 056-7890');
assert.AreEqual('', phone.Clean);
end;

procedure PhoneNumberTests.Extract_area_code;
var phone: IPhoneNumber;
begin
phone := NewPhoneNumber('(223) 456-7890');
assert.AreEqual('223', phone.Area);
end;

procedure PhoneNumberTests.Extract_exchange_code;
var phone: IPhoneNumber;
begin
phone := NewPhoneNumber('1234567890');
assert.AreEqual('123', phone.AreaCode);
phone := NewPhoneNumber('223.456.7890');
assert.AreEqual('456', phone.Exchange);
end;

procedure PhoneNumberTests.Formats_a_number;
var phone: IPhoneNumber;
begin
phone := NewPhoneNumber('1234567890');
assert.AreEqual('(123) 456-7890', phone.ToString);
phone := NewPhoneNumber('2234567890');
assert.AreEqual('(223) 456-7890', phone.ToString);
end;

initialization
Expand Down