From dc0466ad4d8726f15c8c41809ed5012c7fad0a6b Mon Sep 17 00:00:00 2001 From: Ryan Potts Date: Fri, 28 Apr 2017 20:50:11 -0400 Subject: [PATCH] phone-number: sync with updated canonical-data.json related to PR https://github.com/exercism/x-common/pull/745 --- .../phone-number/uPhoneNumberExample.pas | 32 +++++++-- exercises/phone-number/uPhoneNumberTests.pas | 65 ++++++++++++++----- 2 files changed, 75 insertions(+), 22 deletions(-) diff --git a/exercises/phone-number/uPhoneNumberExample.pas b/exercises/phone-number/uPhoneNumberExample.pas index 1e686f7b..04ca9648 100644 --- a/exercises/phone-number/uPhoneNumberExample.pas +++ b/exercises/phone-number/uPhoneNumberExample.pas @@ -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; @@ -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; @@ -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; @@ -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. diff --git a/exercises/phone-number/uPhoneNumberTests.pas b/exercises/phone-number/uPhoneNumberTests.pas index 036817bf..ca8be52d 100644 --- a/exercises/phone-number/uPhoneNumberTests.pas +++ b/exercises/phone-number/uPhoneNumberTests.pas @@ -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] @@ -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')] @@ -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; @@ -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