trackler 2.0.5.13 → 2.0.5.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/common/.travis.yml +1 -0
- data/common/bin/check_required_files_present +55 -0
- data/lib/trackler/version.rb +1 -1
- data/tracks/pascal/exercises/Hello-World/TestHelloWorld.dpr +60 -0
- data/tracks/pascal/exercises/Hello-World/TestHelloWorld.dproj +176 -0
- data/tracks/pascal/exercises/Hello-World/uHelloWorldExample.pas +24 -0
- data/tracks/pascal/exercises/Hello-World/uTestHelloWorld.pas +65 -0
- data/tracks/pascal/exercises/allergies/AllergyTests.dpr +60 -0
- data/tracks/pascal/exercises/allergies/AllergyTests.dproj +176 -0
- data/tracks/pascal/exercises/allergies/uAllergiesExample.pas +67 -0
- data/tracks/pascal/exercises/allergies/uAllergyTests.pas +177 -0
- data/tracks/pascal/exercises/bank-account/BankAccountTests.dpr +60 -0
- data/tracks/pascal/exercises/bank-account/BankAccountTests.dproj +176 -0
- data/tracks/pascal/exercises/bank-account/uBankAccountExample.pas +96 -0
- data/tracks/pascal/exercises/bank-account/uBankAccountTests.pas +140 -0
- data/tracks/pascal/exercises/beer-song/BeerSongTests.dpr +60 -0
- data/tracks/pascal/exercises/beer-song/BeerSongTests.dproj +176 -0
- data/tracks/pascal/exercises/beer-song/uBeerSongExample.pas +45 -0
- data/tracks/pascal/exercises/beer-song/uBeerSongTests.pas +84 -0
- data/tracks/pascal/exercises/binary-search/BinarySearchTest.dpr +60 -0
- data/tracks/pascal/exercises/binary-search/BinarySearchTest.dproj +176 -0
- data/tracks/pascal/exercises/binary-search/uBinarySearchExample.pas +40 -0
- data/tracks/pascal/exercises/binary-search/uBinarySearchTest.pas +132 -0
- data/tracks/pascal/exercises/bob/BobTests.dpr +60 -0
- data/tracks/pascal/exercises/bob/BobTests.dproj +176 -0
- data/tracks/pascal/exercises/bob/uBobExample.pas +47 -0
- data/tracks/pascal/exercises/bob/uBobTests.pas +180 -0
- data/tracks/pascal/exercises/book-store/BookStoreTests.dpr +60 -0
- data/tracks/pascal/exercises/book-store/BookStoreTests.dproj +176 -0
- data/tracks/pascal/exercises/book-store/uBookStoreExample.pas +144 -0
- data/tracks/pascal/exercises/book-store/uBookStoreTests.pas +56 -0
- data/tracks/pascal/exercises/bowling/BowlingTests.dpr +60 -0
- data/tracks/pascal/exercises/bowling/BowlingTests.dproj +176 -0
- data/tracks/pascal/exercises/bowling/uBowlingExample.pas +105 -0
- data/tracks/pascal/exercises/bowling/uBowlingTests.pas +101 -0
- data/tracks/pascal/exercises/circular-buffer/CircularBufferTests.dpr +60 -0
- data/tracks/pascal/exercises/circular-buffer/CircularBufferTests.dproj +176 -0
- data/tracks/pascal/exercises/circular-buffer/uCircularBufferExample.pas +72 -0
- data/tracks/pascal/exercises/circular-buffer/uCircularBufferTests.pas +249 -0
- data/tracks/pascal/exercises/clock/ClockTest.dpr +60 -0
- data/tracks/pascal/exercises/clock/ClockTest.dproj +176 -0
- data/tracks/pascal/exercises/clock/uClockExample.pas +54 -0
- data/tracks/pascal/exercises/clock/uClockTest.pas +157 -0
- data/tracks/pascal/exercises/etl/ETLtests.dpr +60 -0
- data/tracks/pascal/exercises/etl/ETLtests.dproj +176 -0
- data/tracks/pascal/exercises/etl/uETLexample.pas +25 -0
- data/tracks/pascal/exercises/etl/uETLtests.pas +191 -0
- data/tracks/pascal/exercises/hamming/Hamming.dpr +60 -0
- data/tracks/pascal/exercises/hamming/Hamming.dproj +176 -0
- data/tracks/pascal/exercises/hamming/uHammingExample.pas +24 -0
- data/tracks/pascal/exercises/hamming/uHammingTests.pas +165 -0
- data/tracks/pascal/exercises/leap/LeapTest.dpr +60 -0
- data/tracks/pascal/exercises/leap/LeapTest.dproj +176 -0
- data/tracks/pascal/exercises/leap/uLeapExample.pas +17 -0
- data/tracks/pascal/exercises/leap/uLeapTests.pas +81 -0
- data/tracks/pascal/exercises/nucleotide-count/NucleotideCountTest.dpr +60 -0
- data/tracks/pascal/exercises/nucleotide-count/NucleotideCountTest.dproj +176 -0
- data/tracks/pascal/exercises/nucleotide-count/uNucleotideCountExample.pas +72 -0
- data/tracks/pascal/exercises/nucleotide-count/uNucleotideCountTest.pas +190 -0
- data/tracks/pascal/exercises/perfect-numbers/PerfectNumbersTest.dpr +60 -0
- data/tracks/pascal/exercises/perfect-numbers/PerfectNumbersTest.dproj +176 -0
- data/tracks/pascal/exercises/perfect-numbers/uPerfectNumbersExample.pas +34 -0
- data/tracks/pascal/exercises/perfect-numbers/uPerfectNumbersTest.pas +48 -0
- data/tracks/pascal/exercises/phone-number/PhoneNumberTests.dpr +60 -0
- data/tracks/pascal/exercises/phone-number/PhoneNumberTests.dproj +176 -0
- data/tracks/pascal/exercises/phone-number/uPhoneNumberExample.pas +102 -0
- data/tracks/pascal/exercises/phone-number/uPhoneNumberTests.pas +138 -0
- data/tracks/php/exercises/variable-length-quantity/variable-length-quantity_test.php +1 -1
- data/tracks/ruby/Gemfile +0 -1
- data/tracks/ruby/Makefile +2 -1
- data/tracks/ruby/Rakefile +3 -0
- data/tracks/ruby/exercises/simple-linked-list/.meta/.version +1 -0
- data/tracks/ruby/exercises/simple-linked-list/example.rb +39 -48
- data/tracks/ruby/exercises/simple-linked-list/simple_linked_list_test.rb +99 -125
- data/tracks/ruby/exercises/wordy/.meta/.version +1 -0
- data/tracks/ruby/exercises/wordy/example.rb +4 -0
- data/tracks/ruby/exercises/wordy/example.tt +17 -0
- data/tracks/ruby/exercises/wordy/wordy_test.rb +66 -35
- data/tracks/ruby/lib/wordy_cases.rb +67 -0
- data/tracks/ruby/test/wordy_cases_test.rb +102 -0
- data/tracks/scala/config.json +7 -1
- data/tracks/scala/exercises/connect/{README.md → HINTS.md} +1 -12
- data/tracks/scala/exercises/connect/build.sbt +2 -2
- metadata +73 -3
@@ -0,0 +1,34 @@
|
|
1
|
+
unit uPerfectNumbers;
|
2
|
+
|
3
|
+
interface
|
4
|
+
|
5
|
+
type
|
6
|
+
NumberType = (Perfect, Abundant, Deficient);
|
7
|
+
|
8
|
+
PerfectNumber = class
|
9
|
+
public
|
10
|
+
class function Classify(aNumber: integer): Numbertype; static;
|
11
|
+
end;
|
12
|
+
|
13
|
+
implementation
|
14
|
+
|
15
|
+
class function PerfectNumber.Classify(aNumber: Integer): NumberType;
|
16
|
+
var sumOfFactors: integer;
|
17
|
+
i: integer;
|
18
|
+
begin
|
19
|
+
sumOfFactors := 0;
|
20
|
+
|
21
|
+
for i := 1 to aNumber - 1 do
|
22
|
+
if aNumber mod i = 0 then
|
23
|
+
sumOfFactors := sumOfFactors + i;
|
24
|
+
|
25
|
+
if sumOfFactors < aNumber then
|
26
|
+
result := Deficient
|
27
|
+
else
|
28
|
+
if sumOfFactors = aNumber then
|
29
|
+
result := Perfect
|
30
|
+
else
|
31
|
+
result := Abundant;
|
32
|
+
end;
|
33
|
+
|
34
|
+
end.
|
@@ -0,0 +1,48 @@
|
|
1
|
+
unit uPerfectNumbersTest;
|
2
|
+
|
3
|
+
interface
|
4
|
+
uses
|
5
|
+
DUnitX.TestFramework;
|
6
|
+
|
7
|
+
type
|
8
|
+
|
9
|
+
[TestFixture]
|
10
|
+
PerfectNumbersTest = class(TObject)
|
11
|
+
public
|
12
|
+
[TestCase('3','3')]
|
13
|
+
// [TestCase('7','7')]
|
14
|
+
// [TestCase('13','13')]
|
15
|
+
procedure Can_classify_deficient_numbers(const aNumber: Integer);
|
16
|
+
|
17
|
+
// [TestCase('6','6')]
|
18
|
+
// [TestCase('28','28')]
|
19
|
+
// [TestCase('496','496')]
|
20
|
+
procedure Can_classify_perfect_numbers(const aNumber: Integer);
|
21
|
+
|
22
|
+
// [TestCase('12','12')]
|
23
|
+
// [TestCase('18','18')]
|
24
|
+
// [TestCase('20','20')]
|
25
|
+
procedure Can_classify_abundant_numbers(const aNumber: Integer);
|
26
|
+
end;
|
27
|
+
|
28
|
+
implementation
|
29
|
+
uses uPerfectNumbers;
|
30
|
+
|
31
|
+
procedure PerfectNumbersTest.Can_classify_deficient_numbers(const aNumber: Integer);
|
32
|
+
begin
|
33
|
+
Assert.AreEqual(Deficient, PerfectNumber.Classify(aNumber));
|
34
|
+
end;
|
35
|
+
|
36
|
+
procedure PerfectNumbersTest.Can_classify_perfect_numbers(const aNumber: Integer);
|
37
|
+
begin
|
38
|
+
Assert.AreEqual(Perfect, PerfectNumber.Classify(aNumber));
|
39
|
+
end;
|
40
|
+
|
41
|
+
procedure PerfectNumbersTest.Can_classify_abundant_numbers(const aNumber: Integer);
|
42
|
+
begin
|
43
|
+
Assert.AreEqual(Abundant, PerfectNumber.Classify(aNumber));
|
44
|
+
end;
|
45
|
+
|
46
|
+
initialization
|
47
|
+
TDUnitX.RegisterTestFixture(PerfectNumbersTest);
|
48
|
+
end.
|
@@ -0,0 +1,60 @@
|
|
1
|
+
program PhoneNumberTests;
|
2
|
+
|
3
|
+
{$IFNDEF TESTINSIGHT}
|
4
|
+
{$APPTYPE CONSOLE}
|
5
|
+
{$ENDIF}{$STRONGLINKTYPES ON}
|
6
|
+
uses
|
7
|
+
System.SysUtils,
|
8
|
+
{$IFDEF TESTINSIGHT}
|
9
|
+
TestInsight.DUnitX,
|
10
|
+
{$ENDIF }
|
11
|
+
DUnitX.Loggers.Console,
|
12
|
+
DUnitX.Loggers.Xml.NUnit,
|
13
|
+
DUnitX.TestFramework,
|
14
|
+
uPhoneNumberTests in 'uPhoneNumberTests.pas',
|
15
|
+
uPhoneNumber in 'uPhoneNumber.pas';
|
16
|
+
|
17
|
+
var
|
18
|
+
runner : ITestRunner;
|
19
|
+
results : IRunResults;
|
20
|
+
logger : ITestLogger;
|
21
|
+
nunitLogger : ITestLogger;
|
22
|
+
begin
|
23
|
+
{$IFDEF TESTINSIGHT}
|
24
|
+
TestInsight.DUnitX.RunRegisteredTests;
|
25
|
+
exit;
|
26
|
+
{$ENDIF}
|
27
|
+
try
|
28
|
+
//Check command line options, will exit if invalid
|
29
|
+
TDUnitX.CheckCommandLine;
|
30
|
+
//Create the test runner
|
31
|
+
runner := TDUnitX.CreateRunner;
|
32
|
+
//Tell the runner to use RTTI to find Fixtures
|
33
|
+
runner.UseRTTI := True;
|
34
|
+
//tell the runner how we will log things
|
35
|
+
//Log to the console window
|
36
|
+
logger := TDUnitXConsoleLogger.Create(true);
|
37
|
+
runner.AddLogger(logger);
|
38
|
+
//Generate an NUnit compatible XML File
|
39
|
+
nunitLogger := TDUnitXXMLNUnitFileLogger.Create(TDUnitX.Options.XMLOutputFile);
|
40
|
+
runner.AddLogger(nunitLogger);
|
41
|
+
runner.FailsOnNoAsserts := False; //When true, Assertions must be made during tests;
|
42
|
+
|
43
|
+
//Run tests
|
44
|
+
results := runner.Execute;
|
45
|
+
if not results.AllPassed then
|
46
|
+
System.ExitCode := EXIT_ERRORS;
|
47
|
+
|
48
|
+
{$IFNDEF CI}
|
49
|
+
//We don't want this happening when running under CI.
|
50
|
+
if TDUnitX.Options.ExitBehavior = TDUnitXExitBehavior.Pause then
|
51
|
+
begin
|
52
|
+
System.Write('Done.. press <Enter> key to quit.');
|
53
|
+
System.Readln;
|
54
|
+
end;
|
55
|
+
{$ENDIF}
|
56
|
+
except
|
57
|
+
on E: Exception do
|
58
|
+
System.Writeln(E.ClassName, ': ', E.Message);
|
59
|
+
end;
|
60
|
+
end.
|
@@ -0,0 +1,176 @@
|
|
1
|
+
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
2
|
+
<PropertyGroup>
|
3
|
+
<ProjectGuid>{F48E93D8-4D8C-41F2-8704-CC866D636E78}</ProjectGuid>
|
4
|
+
<ProjectVersion>15.3</ProjectVersion>
|
5
|
+
<FrameworkType>None</FrameworkType>
|
6
|
+
<MainSource>PhoneNumberTests.dpr</MainSource>
|
7
|
+
<Base>True</Base>
|
8
|
+
<Config Condition="'$(Config)'==''">Debug</Config>
|
9
|
+
<Platform Condition="'$(Platform)'==''">Win32</Platform>
|
10
|
+
<TargetedPlatforms>1</TargetedPlatforms>
|
11
|
+
<AppType>Console</AppType>
|
12
|
+
</PropertyGroup>
|
13
|
+
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
|
14
|
+
<Base>true</Base>
|
15
|
+
</PropertyGroup>
|
16
|
+
<PropertyGroup Condition="('$(Platform)'=='OSX32' and '$(Base)'=='true') or '$(Base_OSX32)'!=''">
|
17
|
+
<Base_OSX32>true</Base_OSX32>
|
18
|
+
<CfgParent>Base</CfgParent>
|
19
|
+
<Base>true</Base>
|
20
|
+
</PropertyGroup>
|
21
|
+
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
|
22
|
+
<Base_Win32>true</Base_Win32>
|
23
|
+
<CfgParent>Base</CfgParent>
|
24
|
+
<Base>true</Base>
|
25
|
+
</PropertyGroup>
|
26
|
+
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
|
27
|
+
<Base_Win64>true</Base_Win64>
|
28
|
+
<CfgParent>Base</CfgParent>
|
29
|
+
<Base>true</Base>
|
30
|
+
</PropertyGroup>
|
31
|
+
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
|
32
|
+
<Cfg_1>true</Cfg_1>
|
33
|
+
<CfgParent>Base</CfgParent>
|
34
|
+
<Base>true</Base>
|
35
|
+
</PropertyGroup>
|
36
|
+
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
|
37
|
+
<Cfg_1_Win32>true</Cfg_1_Win32>
|
38
|
+
<CfgParent>Cfg_1</CfgParent>
|
39
|
+
<Cfg_1>true</Cfg_1>
|
40
|
+
<Base>true</Base>
|
41
|
+
</PropertyGroup>
|
42
|
+
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
|
43
|
+
<Cfg_2>true</Cfg_2>
|
44
|
+
<CfgParent>Base</CfgParent>
|
45
|
+
<Base>true</Base>
|
46
|
+
</PropertyGroup>
|
47
|
+
<PropertyGroup Condition="'$(Base)'!=''">
|
48
|
+
<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace>
|
49
|
+
<Icns_MainIcns>$(BDS)\bin\delphi_PROJECTICNS.icns</Icns_MainIcns>
|
50
|
+
<DCC_UnitSearchPath>$(DUnitX);$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
|
51
|
+
<DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
|
52
|
+
<DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput>
|
53
|
+
<DCC_E>false</DCC_E>
|
54
|
+
<DCC_N>false</DCC_N>
|
55
|
+
<DCC_S>false</DCC_S>
|
56
|
+
<DCC_F>false</DCC_F>
|
57
|
+
<DCC_K>false</DCC_K>
|
58
|
+
</PropertyGroup>
|
59
|
+
<PropertyGroup Condition="'$(Base_OSX32)'!=''">
|
60
|
+
<DCC_UsePackage>FireDACASADriver;FireDACSqliteDriver;bindcompfmx;DBXSqliteDriver;FireDACPgDriver;FireDACODBCDriver;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;FireDACCommon;bindcomp;DBXInterBaseDriver;DataSnapCommon;xmlrtl;ibxpress;DbxCommonDriver;IndyProtocols;dbxcds;DBXMySQLDriver;FireDACCommonDriver;soaprtl;bindengine;bindcompdbx;FMXTee;fmxFireDAC;FireDACADSDriver;CustomIPTransport;FireDAC;dsnap;IndyIPServer;fmxase;IndyCore;IndyIPCommon;CloudService;FireDACIBDriver;FmxTeeUI;inet;fmxobj;FireDACMySQLDriver;inetdbxpress;fmxdae;RESTComponents;FireDACMSAccDriver;dbexpress;IndyIPClient;$(DCC_UsePackage)</DCC_UsePackage>
|
61
|
+
</PropertyGroup>
|
62
|
+
<PropertyGroup Condition="'$(Base_Win32)'!=''">
|
63
|
+
<DCC_UsePackage>frxDB19;L208_r140;FireDACASADriver;FireDACSqliteDriver;bindcompfmx;DBXSqliteDriver;AbbreviaVCL;vcldbx;FireDACPgDriver;FireDACODBCDriver;S404_r;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;FireDACCommon;bindcomp;TeeDB;frx19;vclib;inetdbbde;DBXInterBaseDriver;Tee;DataSnapCommon;vclFireDAC;Rave110VCL;xmlrtl;svnui;ibxpress;DbxCommonDriver;vclimg;IndyProtocols;dbxcds;DBXMySQLDriver;FireDACCommonDriver;MetropolisUILiveTile;O408_r;soaprtl;bindengine;vclactnband;vcldb;bindcompdbx;vcldsnap;bindcompvcl;FMXTee;TeeUI;AsyncPro;vclie;XMLPartner_PR;fmxFireDAC;FireDACADSDriver;vcltouch;CustomIPTransport;G114_R140;vclribbon;VclSmp;FireDAC;dsnap;IndyIPServer;Intraweb;fmxase;vcl;IndyCore;VCLRESTComponents;OmniThreadLibraryRuntimeXE5;IndyIPCommon;CloudService;CodeSiteExpressPkg;dsnapcon;FireDACIBDriver;FmxTeeUI;inet;fmxobj;E111_R120;FireDACMySQLDriver;vclx;inetdbxpress;svn;fmxdae;frxe19;RESTComponents;bdertl;FireDACMSAccDriver;adortl;dbexpress;IndyIPClient;$(DCC_UsePackage)</DCC_UsePackage>
|
64
|
+
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
|
65
|
+
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
|
66
|
+
<VerInfo_Locale>1033</VerInfo_Locale>
|
67
|
+
</PropertyGroup>
|
68
|
+
<PropertyGroup Condition="'$(Base_Win64)'!=''">
|
69
|
+
<DCC_UsePackage>FireDACASADriver;FireDACSqliteDriver;bindcompfmx;DBXSqliteDriver;AbbreviaVCL;FireDACPgDriver;FireDACODBCDriver;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;FireDACCommon;bindcomp;TeeDB;vclib;DBXInterBaseDriver;Tee;DataSnapCommon;vclFireDAC;xmlrtl;ibxpress;DbxCommonDriver;vclimg;IndyProtocols;dbxcds;DBXMySQLDriver;FireDACCommonDriver;MetropolisUILiveTile;O408_r;soaprtl;bindengine;vclactnband;vcldb;bindcompdbx;vcldsnap;bindcompvcl;FMXTee;TeeUI;vclie;fmxFireDAC;FireDACADSDriver;vcltouch;CustomIPTransport;vclribbon;VclSmp;FireDAC;dsnap;IndyIPServer;Intraweb;fmxase;vcl;IndyCore;VCLRESTComponents;IndyIPCommon;CloudService;dsnapcon;FireDACIBDriver;FmxTeeUI;inet;fmxobj;FireDACMySQLDriver;vclx;inetdbxpress;fmxdae;RESTComponents;FireDACMSAccDriver;adortl;dbexpress;IndyIPClient;$(DCC_UsePackage)</DCC_UsePackage>
|
70
|
+
</PropertyGroup>
|
71
|
+
<PropertyGroup Condition="'$(Cfg_1)'!=''">
|
72
|
+
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
|
73
|
+
<DCC_DebugDCUs>true</DCC_DebugDCUs>
|
74
|
+
<DCC_Optimize>false</DCC_Optimize>
|
75
|
+
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
|
76
|
+
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
|
77
|
+
<DCC_RemoteDebug>true</DCC_RemoteDebug>
|
78
|
+
</PropertyGroup>
|
79
|
+
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
|
80
|
+
<DCC_RemoteDebug>false</DCC_RemoteDebug>
|
81
|
+
</PropertyGroup>
|
82
|
+
<PropertyGroup Condition="'$(Cfg_2)'!=''">
|
83
|
+
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
|
84
|
+
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
|
85
|
+
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
|
86
|
+
<DCC_DebugInformation>0</DCC_DebugInformation>
|
87
|
+
</PropertyGroup>
|
88
|
+
<ItemGroup>
|
89
|
+
<DelphiCompile Include="$(MainSource)">
|
90
|
+
<MainSource>MainSource</MainSource>
|
91
|
+
</DelphiCompile>
|
92
|
+
<DCCReference Include="uPhoneNumberTests.pas"/>
|
93
|
+
<DCCReference Include="uPhoneNumber.pas"/>
|
94
|
+
<BuildConfiguration Include="Release">
|
95
|
+
<Key>Cfg_2</Key>
|
96
|
+
<CfgParent>Base</CfgParent>
|
97
|
+
</BuildConfiguration>
|
98
|
+
<BuildConfiguration Include="Base">
|
99
|
+
<Key>Base</Key>
|
100
|
+
</BuildConfiguration>
|
101
|
+
<BuildConfiguration Include="Debug">
|
102
|
+
<Key>Cfg_1</Key>
|
103
|
+
<CfgParent>Base</CfgParent>
|
104
|
+
</BuildConfiguration>
|
105
|
+
</ItemGroup>
|
106
|
+
<ProjectExtensions>
|
107
|
+
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
|
108
|
+
<Borland.ProjectType/>
|
109
|
+
<BorlandProject>
|
110
|
+
<Delphi.Personality>
|
111
|
+
<VersionInfo>
|
112
|
+
<VersionInfo Name="IncludeVerInfo">False</VersionInfo>
|
113
|
+
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
|
114
|
+
<VersionInfo Name="MajorVer">1</VersionInfo>
|
115
|
+
<VersionInfo Name="MinorVer">0</VersionInfo>
|
116
|
+
<VersionInfo Name="Release">0</VersionInfo>
|
117
|
+
<VersionInfo Name="Build">0</VersionInfo>
|
118
|
+
<VersionInfo Name="Debug">False</VersionInfo>
|
119
|
+
<VersionInfo Name="PreRelease">False</VersionInfo>
|
120
|
+
<VersionInfo Name="Special">False</VersionInfo>
|
121
|
+
<VersionInfo Name="Private">False</VersionInfo>
|
122
|
+
<VersionInfo Name="DLL">False</VersionInfo>
|
123
|
+
<VersionInfo Name="Locale">1033</VersionInfo>
|
124
|
+
<VersionInfo Name="CodePage">1252</VersionInfo>
|
125
|
+
</VersionInfo>
|
126
|
+
<VersionInfoKeys>
|
127
|
+
<VersionInfoKeys Name="CompanyName"/>
|
128
|
+
<VersionInfoKeys Name="FileDescription"/>
|
129
|
+
<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
|
130
|
+
<VersionInfoKeys Name="InternalName"/>
|
131
|
+
<VersionInfoKeys Name="LegalCopyright"/>
|
132
|
+
<VersionInfoKeys Name="LegalTrademarks"/>
|
133
|
+
<VersionInfoKeys Name="OriginalFilename"/>
|
134
|
+
<VersionInfoKeys Name="ProductName"/>
|
135
|
+
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
|
136
|
+
<VersionInfoKeys Name="Comments"/>
|
137
|
+
<VersionInfoKeys Name="CFBundleName"/>
|
138
|
+
<VersionInfoKeys Name="CFBundleDisplayName"/>
|
139
|
+
<VersionInfoKeys Name="UIDeviceFamily"/>
|
140
|
+
<VersionInfoKeys Name="CFBundleIdentifier"/>
|
141
|
+
<VersionInfoKeys Name="CFBundleVersion"/>
|
142
|
+
<VersionInfoKeys Name="CFBundlePackageType"/>
|
143
|
+
<VersionInfoKeys Name="CFBundleSignature"/>
|
144
|
+
<VersionInfoKeys Name="CFBundleAllowMixedLocalizations"/>
|
145
|
+
<VersionInfoKeys Name="UISupportedInterfaceOrientations"/>
|
146
|
+
<VersionInfoKeys Name="CFBundleExecutable"/>
|
147
|
+
<VersionInfoKeys Name="CFBundleResourceSpecification"/>
|
148
|
+
<VersionInfoKeys Name="LSRequiresIPhoneOS"/>
|
149
|
+
<VersionInfoKeys Name="CFBundleInfoDictionaryVersion"/>
|
150
|
+
<VersionInfoKeys Name="CFBundleDevelopmentRegion"/>
|
151
|
+
<VersionInfoKeys Name="package"/>
|
152
|
+
<VersionInfoKeys Name="label"/>
|
153
|
+
<VersionInfoKeys Name="versionCode"/>
|
154
|
+
<VersionInfoKeys Name="versionName"/>
|
155
|
+
<VersionInfoKeys Name="persistent"/>
|
156
|
+
<VersionInfoKeys Name="restoreAnyVersion"/>
|
157
|
+
<VersionInfoKeys Name="installLocation"/>
|
158
|
+
<VersionInfoKeys Name="largeHeap"/>
|
159
|
+
<VersionInfoKeys Name="theme"/>
|
160
|
+
</VersionInfoKeys>
|
161
|
+
<Source>
|
162
|
+
<Source Name="MainSource">PhoneNumberTests.dpr</Source>
|
163
|
+
</Source>
|
164
|
+
</Delphi.Personality>
|
165
|
+
<Deployment/>
|
166
|
+
<Platforms>
|
167
|
+
<Platform value="OSX32">False</Platform>
|
168
|
+
<Platform value="Win32">True</Platform>
|
169
|
+
<Platform value="Win64">False</Platform>
|
170
|
+
</Platforms>
|
171
|
+
</BorlandProject>
|
172
|
+
<ProjectFileVersion>12</ProjectFileVersion>
|
173
|
+
</ProjectExtensions>
|
174
|
+
<Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
|
175
|
+
<Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
|
176
|
+
</Project>
|
@@ -0,0 +1,102 @@
|
|
1
|
+
unit uPhoneNumber;
|
2
|
+
|
3
|
+
interface
|
4
|
+
|
5
|
+
type
|
6
|
+
IPhoneNumber = interface(IInvokable)
|
7
|
+
['{2415B863-E2D7-4E13-BDEF-F7FE9B3E0788}']
|
8
|
+
function GetNumber: string;
|
9
|
+
function GetAreaCode: string;
|
10
|
+
function ToString: string;
|
11
|
+
property Number: string read GetNumber;
|
12
|
+
property AreaCode: string read GetAreaCode;
|
13
|
+
end;
|
14
|
+
|
15
|
+
function NewPhoneNumber(aPhoneNumber: string): IPhoneNumber;
|
16
|
+
|
17
|
+
implementation
|
18
|
+
uses RegularExpressions, System.SysUtils, System.StrUtils;
|
19
|
+
|
20
|
+
type
|
21
|
+
TPhoneNumber = class(TInterfacedObject, IPhoneNumber)
|
22
|
+
private
|
23
|
+
fDigitsOnly: TRegex;
|
24
|
+
fContainsLetters: TRegex;
|
25
|
+
fNumber: string;
|
26
|
+
fAreaCode: string;
|
27
|
+
function GetNumber: string;
|
28
|
+
function GetAreaCode: string;
|
29
|
+
function GetValidatedPhoneNumber(aPhoneNumber: string): string;
|
30
|
+
function StripOutNonNumerics(aValue: string): string;
|
31
|
+
function IsInvalidPhoneNumber(aPhoneNumber: string): Boolean;
|
32
|
+
function GetInvalidPhoneNumberReplacement(aPhoneNumber: string): string;
|
33
|
+
function IsPhoneNumberwithUSAreaCode(aValue: string): Boolean;
|
34
|
+
public
|
35
|
+
constructor Create(aPhoneNumber: string);
|
36
|
+
function ToString: string;
|
37
|
+
property Number: string read GetNumber;
|
38
|
+
property AreaCode: string read GetAreaCode;
|
39
|
+
end;
|
40
|
+
|
41
|
+
function NewPhoneNumber(aPhoneNumber: string): IPhoneNumber;
|
42
|
+
begin
|
43
|
+
result := TPhoneNumber.Create(aPhoneNumber);
|
44
|
+
end;
|
45
|
+
|
46
|
+
constructor TPhoneNumber.Create(aPhoneNumber: string);
|
47
|
+
begin
|
48
|
+
fDigitsOnly := TRegEx.Create('[^\d]');
|
49
|
+
fContainsLetters := TRegEx.Create('[a-zA-Z]');
|
50
|
+
fNumber := GetValidatedPhoneNumber(aPhoneNumber);
|
51
|
+
fAreaCode := fNumber.Substring(0, 3);
|
52
|
+
end;
|
53
|
+
|
54
|
+
function TPhoneNumber.GetNumber: string;
|
55
|
+
begin
|
56
|
+
result := fNumber;
|
57
|
+
end;
|
58
|
+
|
59
|
+
function TPhoneNumber.GetAreaCode: string;
|
60
|
+
begin
|
61
|
+
result := fAreaCode;
|
62
|
+
end;
|
63
|
+
|
64
|
+
function TPhoneNumber.GetValidatedPhoneNumber(aPhoneNumber: string):string;
|
65
|
+
var stripped: string;
|
66
|
+
begin
|
67
|
+
stripped := StripOutNonNumerics(aPhoneNumber);
|
68
|
+
if IsInvalidPhoneNumber(stripped) then
|
69
|
+
result := GetInvalidPhoneNumberReplacement(stripped)
|
70
|
+
else
|
71
|
+
result := stripped;
|
72
|
+
end;
|
73
|
+
|
74
|
+
function TPhoneNumber.StripOutNonNumerics(aValue: string): string;
|
75
|
+
begin
|
76
|
+
if fContainsLetters.IsMatch(aValue) then
|
77
|
+
result := ''
|
78
|
+
else
|
79
|
+
result := fDigitsOnly.Replace(aValue, '');
|
80
|
+
end;
|
81
|
+
|
82
|
+
function TPhoneNumber.IsInvalidPhoneNumber(aPhoneNumber: string): Boolean;
|
83
|
+
begin
|
84
|
+
result := aPhoneNumber.Length <> 10;
|
85
|
+
end;
|
86
|
+
|
87
|
+
function TPhoneNumber.GetInvalidPhoneNumberReplacement(aPhoneNumber: string): string;
|
88
|
+
begin
|
89
|
+
result := ifthen(IsPhoneNumberwithUSAreaCode(aPhoneNumber), aPhoneNumber.Substring(1), '');
|
90
|
+
end;
|
91
|
+
|
92
|
+
function TPhoneNumber.IsPhoneNumberwithUSAreaCode(aValue: string): Boolean;
|
93
|
+
begin
|
94
|
+
result := (aValue.Length = 11) and aValue.StartsWith('1');
|
95
|
+
end;
|
96
|
+
|
97
|
+
function TPhoneNumber.ToString: string;
|
98
|
+
begin
|
99
|
+
result := Format('(%s) %s-%s',[AreaCode, Number.Substring(3, 3), Number.Substring(6)]);
|
100
|
+
end;
|
101
|
+
|
102
|
+
end.
|
@@ -0,0 +1,138 @@
|
|
1
|
+
unit uPhoneNumberTests;
|
2
|
+
|
3
|
+
interface
|
4
|
+
uses
|
5
|
+
DUnitX.TestFramework;
|
6
|
+
|
7
|
+
type
|
8
|
+
|
9
|
+
[TestFixture]
|
10
|
+
PhoneNumberTests = class(TObject)
|
11
|
+
public
|
12
|
+
[Test]
|
13
|
+
procedure Cleans_parens_spaces_and_dashes;
|
14
|
+
|
15
|
+
[Test]
|
16
|
+
[Ignore]
|
17
|
+
procedure Cleans_numbers_with_dots;
|
18
|
+
|
19
|
+
[Test]
|
20
|
+
[Ignore]
|
21
|
+
procedure Valid_when_11_digits_and_starting_with_1;
|
22
|
+
|
23
|
+
[Test]
|
24
|
+
[Ignore]
|
25
|
+
procedure Invalid_when_11_digits;
|
26
|
+
|
27
|
+
[Test]
|
28
|
+
[Ignore]
|
29
|
+
procedure Invalid_when_12_digits;
|
30
|
+
|
31
|
+
[Test]
|
32
|
+
[Ignore]
|
33
|
+
procedure Invalid_when_9_digits;
|
34
|
+
|
35
|
+
[Test]
|
36
|
+
[Ignore]
|
37
|
+
procedure Invalid_with_letters;
|
38
|
+
|
39
|
+
[Test]
|
40
|
+
[Ignore]
|
41
|
+
procedure Invalid_with_punctuations;
|
42
|
+
|
43
|
+
[Test]
|
44
|
+
[Ignore]
|
45
|
+
procedure Invalid_with_right_number_of_digits_but_letters_mixed_in;
|
46
|
+
|
47
|
+
[Test]
|
48
|
+
[Ignore]
|
49
|
+
procedure Has_an_area_code;
|
50
|
+
|
51
|
+
[Test]
|
52
|
+
[Ignore]
|
53
|
+
procedure Formats_a_number;
|
54
|
+
end;
|
55
|
+
|
56
|
+
implementation
|
57
|
+
uses uPhoneNumber;
|
58
|
+
|
59
|
+
procedure PhoneNumberTests.Cleans_parens_spaces_and_dashes;
|
60
|
+
var phone: IPhoneNumber;
|
61
|
+
begin
|
62
|
+
phone := NewPhoneNumber('(123) 456-7890');
|
63
|
+
assert.AreEqual('1234567890',phone.Number);
|
64
|
+
end;
|
65
|
+
|
66
|
+
procedure PhoneNumberTests.Cleans_numbers_with_dots;
|
67
|
+
var phone: IPhoneNumber;
|
68
|
+
begin
|
69
|
+
phone := NewPhoneNumber('123.456.7890');
|
70
|
+
assert.AreEqual('1234567890',phone.Number);
|
71
|
+
end;
|
72
|
+
|
73
|
+
procedure PhoneNumberTests.Valid_when_11_digits_and_starting_with_1;
|
74
|
+
var phone: IPhoneNumber;
|
75
|
+
begin
|
76
|
+
phone := NewPhoneNumber('11234567890');
|
77
|
+
assert.AreEqual('1234567890', phone.Number);
|
78
|
+
end;
|
79
|
+
|
80
|
+
procedure PhoneNumberTests.Invalid_when_11_digits;
|
81
|
+
var phone: IPhoneNumber;
|
82
|
+
begin
|
83
|
+
phone := NewPhoneNumber('21234567890');
|
84
|
+
assert.AreEqual('', phone.Number);
|
85
|
+
end;
|
86
|
+
|
87
|
+
procedure PhoneNumberTests.Invalid_when_12_digits;
|
88
|
+
var phone: IPhoneNumber;
|
89
|
+
begin
|
90
|
+
phone := NewPhoneNumber('321234567890');
|
91
|
+
assert.AreEqual('', phone.Number);
|
92
|
+
end;
|
93
|
+
|
94
|
+
procedure PhoneNumberTests.Invalid_when_9_digits;
|
95
|
+
var phone: IPhoneNumber;
|
96
|
+
begin
|
97
|
+
phone := NewPhoneNumber('123456789');
|
98
|
+
assert.AreEqual('', phone.Number);
|
99
|
+
end;
|
100
|
+
|
101
|
+
procedure PhoneNumberTests.Invalid_with_letters;
|
102
|
+
var phone: IPhoneNumber;
|
103
|
+
begin
|
104
|
+
phone := NewPhoneNumber('123-abc-7890');
|
105
|
+
assert.AreEqual('', phone.Number);
|
106
|
+
end;
|
107
|
+
|
108
|
+
procedure PhoneNumberTests.Invalid_with_punctuations;
|
109
|
+
var phone: IPhoneNumber;
|
110
|
+
begin
|
111
|
+
phone := NewPhoneNumber('123-@:!-7890');
|
112
|
+
assert.AreEqual('', phone.Number);
|
113
|
+
end;
|
114
|
+
|
115
|
+
procedure PhoneNumberTests.Invalid_with_right_number_of_digits_but_letters_mixed_in;
|
116
|
+
var phone: IPhoneNumber;
|
117
|
+
begin
|
118
|
+
phone := NewPhoneNumber('1a2b3c4d5e6f7g8h9i0j');
|
119
|
+
assert.AreEqual('', phone.Number);
|
120
|
+
end;
|
121
|
+
|
122
|
+
procedure PhoneNumberTests.Has_an_area_code;
|
123
|
+
var phone: IPhoneNumber;
|
124
|
+
begin
|
125
|
+
phone := NewPhoneNumber('1234567890');
|
126
|
+
assert.AreEqual('123', phone.AreaCode);
|
127
|
+
end;
|
128
|
+
|
129
|
+
procedure PhoneNumberTests.Formats_a_number;
|
130
|
+
var phone: IPhoneNumber;
|
131
|
+
begin
|
132
|
+
phone := NewPhoneNumber('1234567890');
|
133
|
+
assert.AreEqual('(123) 456-7890', phone.ToString);
|
134
|
+
end;
|
135
|
+
|
136
|
+
initialization
|
137
|
+
TDUnitX.RegisterTestFixture(PhoneNumberTests);
|
138
|
+
end.
|