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.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/common/.travis.yml +1 -0
  3. data/common/bin/check_required_files_present +55 -0
  4. data/lib/trackler/version.rb +1 -1
  5. data/tracks/pascal/exercises/Hello-World/TestHelloWorld.dpr +60 -0
  6. data/tracks/pascal/exercises/Hello-World/TestHelloWorld.dproj +176 -0
  7. data/tracks/pascal/exercises/Hello-World/uHelloWorldExample.pas +24 -0
  8. data/tracks/pascal/exercises/Hello-World/uTestHelloWorld.pas +65 -0
  9. data/tracks/pascal/exercises/allergies/AllergyTests.dpr +60 -0
  10. data/tracks/pascal/exercises/allergies/AllergyTests.dproj +176 -0
  11. data/tracks/pascal/exercises/allergies/uAllergiesExample.pas +67 -0
  12. data/tracks/pascal/exercises/allergies/uAllergyTests.pas +177 -0
  13. data/tracks/pascal/exercises/bank-account/BankAccountTests.dpr +60 -0
  14. data/tracks/pascal/exercises/bank-account/BankAccountTests.dproj +176 -0
  15. data/tracks/pascal/exercises/bank-account/uBankAccountExample.pas +96 -0
  16. data/tracks/pascal/exercises/bank-account/uBankAccountTests.pas +140 -0
  17. data/tracks/pascal/exercises/beer-song/BeerSongTests.dpr +60 -0
  18. data/tracks/pascal/exercises/beer-song/BeerSongTests.dproj +176 -0
  19. data/tracks/pascal/exercises/beer-song/uBeerSongExample.pas +45 -0
  20. data/tracks/pascal/exercises/beer-song/uBeerSongTests.pas +84 -0
  21. data/tracks/pascal/exercises/binary-search/BinarySearchTest.dpr +60 -0
  22. data/tracks/pascal/exercises/binary-search/BinarySearchTest.dproj +176 -0
  23. data/tracks/pascal/exercises/binary-search/uBinarySearchExample.pas +40 -0
  24. data/tracks/pascal/exercises/binary-search/uBinarySearchTest.pas +132 -0
  25. data/tracks/pascal/exercises/bob/BobTests.dpr +60 -0
  26. data/tracks/pascal/exercises/bob/BobTests.dproj +176 -0
  27. data/tracks/pascal/exercises/bob/uBobExample.pas +47 -0
  28. data/tracks/pascal/exercises/bob/uBobTests.pas +180 -0
  29. data/tracks/pascal/exercises/book-store/BookStoreTests.dpr +60 -0
  30. data/tracks/pascal/exercises/book-store/BookStoreTests.dproj +176 -0
  31. data/tracks/pascal/exercises/book-store/uBookStoreExample.pas +144 -0
  32. data/tracks/pascal/exercises/book-store/uBookStoreTests.pas +56 -0
  33. data/tracks/pascal/exercises/bowling/BowlingTests.dpr +60 -0
  34. data/tracks/pascal/exercises/bowling/BowlingTests.dproj +176 -0
  35. data/tracks/pascal/exercises/bowling/uBowlingExample.pas +105 -0
  36. data/tracks/pascal/exercises/bowling/uBowlingTests.pas +101 -0
  37. data/tracks/pascal/exercises/circular-buffer/CircularBufferTests.dpr +60 -0
  38. data/tracks/pascal/exercises/circular-buffer/CircularBufferTests.dproj +176 -0
  39. data/tracks/pascal/exercises/circular-buffer/uCircularBufferExample.pas +72 -0
  40. data/tracks/pascal/exercises/circular-buffer/uCircularBufferTests.pas +249 -0
  41. data/tracks/pascal/exercises/clock/ClockTest.dpr +60 -0
  42. data/tracks/pascal/exercises/clock/ClockTest.dproj +176 -0
  43. data/tracks/pascal/exercises/clock/uClockExample.pas +54 -0
  44. data/tracks/pascal/exercises/clock/uClockTest.pas +157 -0
  45. data/tracks/pascal/exercises/etl/ETLtests.dpr +60 -0
  46. data/tracks/pascal/exercises/etl/ETLtests.dproj +176 -0
  47. data/tracks/pascal/exercises/etl/uETLexample.pas +25 -0
  48. data/tracks/pascal/exercises/etl/uETLtests.pas +191 -0
  49. data/tracks/pascal/exercises/hamming/Hamming.dpr +60 -0
  50. data/tracks/pascal/exercises/hamming/Hamming.dproj +176 -0
  51. data/tracks/pascal/exercises/hamming/uHammingExample.pas +24 -0
  52. data/tracks/pascal/exercises/hamming/uHammingTests.pas +165 -0
  53. data/tracks/pascal/exercises/leap/LeapTest.dpr +60 -0
  54. data/tracks/pascal/exercises/leap/LeapTest.dproj +176 -0
  55. data/tracks/pascal/exercises/leap/uLeapExample.pas +17 -0
  56. data/tracks/pascal/exercises/leap/uLeapTests.pas +81 -0
  57. data/tracks/pascal/exercises/nucleotide-count/NucleotideCountTest.dpr +60 -0
  58. data/tracks/pascal/exercises/nucleotide-count/NucleotideCountTest.dproj +176 -0
  59. data/tracks/pascal/exercises/nucleotide-count/uNucleotideCountExample.pas +72 -0
  60. data/tracks/pascal/exercises/nucleotide-count/uNucleotideCountTest.pas +190 -0
  61. data/tracks/pascal/exercises/perfect-numbers/PerfectNumbersTest.dpr +60 -0
  62. data/tracks/pascal/exercises/perfect-numbers/PerfectNumbersTest.dproj +176 -0
  63. data/tracks/pascal/exercises/perfect-numbers/uPerfectNumbersExample.pas +34 -0
  64. data/tracks/pascal/exercises/perfect-numbers/uPerfectNumbersTest.pas +48 -0
  65. data/tracks/pascal/exercises/phone-number/PhoneNumberTests.dpr +60 -0
  66. data/tracks/pascal/exercises/phone-number/PhoneNumberTests.dproj +176 -0
  67. data/tracks/pascal/exercises/phone-number/uPhoneNumberExample.pas +102 -0
  68. data/tracks/pascal/exercises/phone-number/uPhoneNumberTests.pas +138 -0
  69. data/tracks/php/exercises/variable-length-quantity/variable-length-quantity_test.php +1 -1
  70. data/tracks/ruby/Gemfile +0 -1
  71. data/tracks/ruby/Makefile +2 -1
  72. data/tracks/ruby/Rakefile +3 -0
  73. data/tracks/ruby/exercises/simple-linked-list/.meta/.version +1 -0
  74. data/tracks/ruby/exercises/simple-linked-list/example.rb +39 -48
  75. data/tracks/ruby/exercises/simple-linked-list/simple_linked_list_test.rb +99 -125
  76. data/tracks/ruby/exercises/wordy/.meta/.version +1 -0
  77. data/tracks/ruby/exercises/wordy/example.rb +4 -0
  78. data/tracks/ruby/exercises/wordy/example.tt +17 -0
  79. data/tracks/ruby/exercises/wordy/wordy_test.rb +66 -35
  80. data/tracks/ruby/lib/wordy_cases.rb +67 -0
  81. data/tracks/ruby/test/wordy_cases_test.rb +102 -0
  82. data/tracks/scala/config.json +7 -1
  83. data/tracks/scala/exercises/connect/{README.md → HINTS.md} +1 -12
  84. data/tracks/scala/exercises/connect/build.sbt +2 -2
  85. 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.