mirror of
https://github.com/claunia/cuetools.net.git
synced 2025-12-16 18:14:25 +00:00
tests
This commit is contained in:
@@ -835,7 +835,7 @@ namespace CUETools.AccurateRip
|
|||||||
{
|
{
|
||||||
currentOffset = tempLocation + i - 20 * 588 + 445 * 588;
|
currentOffset = tempLocation + i - 20 * 588 + 445 * 588;
|
||||||
}
|
}
|
||||||
if (currentOffset <= trStart)
|
if (currentOffset < trStart)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
_CRCAR[iTrack, i] = crcar + part._CRCAR[iTrack, i];
|
_CRCAR[iTrack, i] = crcar + part._CRCAR[iTrack, i];
|
||||||
@@ -872,6 +872,8 @@ namespace CUETools.AccurateRip
|
|||||||
int leadout_len = Math.Max(4096 * 4, (calcSyn || calcParity) ? stride + laststride : 0);
|
int leadout_len = Math.Max(4096 * 4, (calcSyn || calcParity) ? stride + laststride : 0);
|
||||||
leadin = new ushort[leadin_len];
|
leadin = new ushort[leadin_len];
|
||||||
leadout = new ushort[leadout_len];
|
leadout = new ushort[leadout_len];
|
||||||
|
leadinCrc = null;
|
||||||
|
leadoutCrc = null;
|
||||||
_currentTrack = 0;
|
_currentTrack = 0;
|
||||||
Position = 0; // NOT _toc[_toc.FirstAudio][0].Start * 588;
|
Position = 0; // NOT _toc[_toc.FirstAudio][0].Start * 588;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -997,96 +997,6 @@ namespace CUETools.Codecs
|
|||||||
public string Path { get { return null; } }
|
public string Path { get { return null; } }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class NoiseGenerator : IAudioSource
|
|
||||||
{
|
|
||||||
private long _sampleOffset, _sampleCount;
|
|
||||||
private AudioPCMConfig pcm;
|
|
||||||
private Random rnd;
|
|
||||||
private byte[] temp;
|
|
||||||
private int tempOffs;
|
|
||||||
|
|
||||||
public NoiseGenerator(AudioPCMConfig pcm, long sampleCount, int seed, int offset)
|
|
||||||
{
|
|
||||||
if (offset < 0)
|
|
||||||
throw new ArgumentOutOfRangeException("offset", "offset cannot be negative");
|
|
||||||
|
|
||||||
this._sampleOffset = 0;
|
|
||||||
this._sampleCount = sampleCount;
|
|
||||||
this.pcm = pcm;
|
|
||||||
this.rnd = new Random(seed);
|
|
||||||
this.temp = new byte[8192 * pcm.BlockAlign];
|
|
||||||
this.tempOffs = temp.Length;
|
|
||||||
int byteOff = offset * pcm.BlockAlign;
|
|
||||||
for (int k = 0; k < byteOff / temp.Length; k++)
|
|
||||||
rnd.NextBytes(temp);
|
|
||||||
if (byteOff % temp.Length > 0)
|
|
||||||
rnd.NextBytes(new byte[byteOff % temp.Length]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public NoiseGenerator(long sampleCount)
|
|
||||||
: this(AudioPCMConfig.RedBook, sampleCount, 0, 0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public long Length
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return _sampleCount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public long Remaining
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return _sampleCount - _sampleOffset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public long Position
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return _sampleOffset;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
_sampleOffset = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public AudioPCMConfig PCM { get { return pcm; } }
|
|
||||||
|
|
||||||
public int Read(AudioBuffer buff, int maxLength)
|
|
||||||
{
|
|
||||||
buff.Prepare(this, maxLength);
|
|
||||||
|
|
||||||
int buffOffs = 0;
|
|
||||||
while (buffOffs < buff.ByteLength)
|
|
||||||
{
|
|
||||||
if (tempOffs == temp.Length)
|
|
||||||
{
|
|
||||||
rnd.NextBytes(temp);
|
|
||||||
tempOffs = 0;
|
|
||||||
}
|
|
||||||
int chunk = Math.Min(buff.ByteLength - buffOffs, temp.Length - tempOffs);
|
|
||||||
Array.Copy(temp, tempOffs, buff.Bytes, buffOffs, chunk);
|
|
||||||
buffOffs += chunk;
|
|
||||||
tempOffs += chunk;
|
|
||||||
}
|
|
||||||
|
|
||||||
_sampleOffset += buff.Length;
|
|
||||||
return buff.Length;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Close()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Path { get { return null; } }
|
|
||||||
}
|
|
||||||
|
|
||||||
[AudioDecoderClass("builtin wav", "wav")]
|
[AudioDecoderClass("builtin wav", "wav")]
|
||||||
public class WAVReader : IAudioSource
|
public class WAVReader : IAudioSource
|
||||||
{
|
{
|
||||||
|
|||||||
70
CUETools.TestHelpers/CUETools.TestHelpers.csproj
Normal file
70
CUETools.TestHelpers/CUETools.TestHelpers.csproj
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProductVersion>9.0.30729</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>CUETools.TestHelpers</RootNamespace>
|
||||||
|
<AssemblyName>CUETools.TestHelpers</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<TargetFrameworkSubset>
|
||||||
|
</TargetFrameworkSubset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="NoiseAndErrorsGenerator.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="TestImageGenerator.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\CUETools.AccurateRip\CUETools.AccurateRip.csproj">
|
||||||
|
<Project>{5802C7E9-157E-4124-946D-70B5AE48A5A1}</Project>
|
||||||
|
<Name>CUETools.AccurateRip</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\CUETools.CDImage\CUETools.CDImage.csproj">
|
||||||
|
<Project>{1DD41038-D885-46C5-8DDE-E0B82F066584}</Project>
|
||||||
|
<Name>CUETools.CDImage</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\CUETools.Codecs\CUETools.Codecs.csproj">
|
||||||
|
<Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project>
|
||||||
|
<Name>CUETools.Codecs</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="app.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
115
CUETools.TestHelpers/NoiseAndErrorsGenerator.cs
Normal file
115
CUETools.TestHelpers/NoiseAndErrorsGenerator.cs
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using CUETools.Codecs;
|
||||||
|
|
||||||
|
namespace CUETools.TestHelpers
|
||||||
|
{
|
||||||
|
public class NoiseAndErrorsGenerator : IAudioSource
|
||||||
|
{
|
||||||
|
private long _sampleOffset, _sampleCount;
|
||||||
|
private AudioPCMConfig pcm;
|
||||||
|
private Random rnd, rnd2;
|
||||||
|
private byte[] temp;
|
||||||
|
private int[] errors;
|
||||||
|
private int tempOffs;
|
||||||
|
private int nextError;
|
||||||
|
|
||||||
|
public NoiseAndErrorsGenerator(AudioPCMConfig pcm, long sampleCount, int seed, int offset, int errors)
|
||||||
|
{
|
||||||
|
if (offset < 0)
|
||||||
|
throw new ArgumentOutOfRangeException("offset", "offset cannot be negative");
|
||||||
|
if (errors < 0)
|
||||||
|
throw new ArgumentOutOfRangeException("offset", "errors cannot be negative");
|
||||||
|
|
||||||
|
this._sampleOffset = 0;
|
||||||
|
this._sampleCount = sampleCount;
|
||||||
|
this.pcm = pcm;
|
||||||
|
this.rnd = new Random(seed);
|
||||||
|
this.temp = new byte[8192 * pcm.BlockAlign];
|
||||||
|
this.tempOffs = temp.Length;
|
||||||
|
int byteOff = offset * pcm.BlockAlign;
|
||||||
|
for (int k = 0; k < byteOff / temp.Length; k++)
|
||||||
|
rnd.NextBytes(temp);
|
||||||
|
if (byteOff % temp.Length > 0)
|
||||||
|
rnd.NextBytes(new byte[byteOff % temp.Length]);
|
||||||
|
this.errors = new int[errors];
|
||||||
|
this.rnd2 = new Random(seed);
|
||||||
|
for (int i = 0; i < errors; i++)
|
||||||
|
this.errors[i] = this.rnd2.Next(0, (int)sampleCount);
|
||||||
|
this.rnd2 = new Random(seed);
|
||||||
|
Array.Sort(this.errors);
|
||||||
|
this.nextError = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NoiseAndErrorsGenerator(long sampleCount)
|
||||||
|
: this(AudioPCMConfig.RedBook, sampleCount, 0, 0, 0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public long Length
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _sampleCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public long Remaining
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _sampleCount - _sampleOffset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public long Position
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _sampleOffset;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_sampleOffset = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AudioPCMConfig PCM { get { return pcm; } }
|
||||||
|
|
||||||
|
public int Read(AudioBuffer buff, int maxLength)
|
||||||
|
{
|
||||||
|
buff.Prepare(this, maxLength);
|
||||||
|
|
||||||
|
int buffOffs = 0;
|
||||||
|
while (buffOffs < buff.ByteLength)
|
||||||
|
{
|
||||||
|
if (tempOffs == temp.Length)
|
||||||
|
{
|
||||||
|
rnd.NextBytes(temp);
|
||||||
|
tempOffs = 0;
|
||||||
|
}
|
||||||
|
int chunk = Math.Min(buff.ByteLength - buffOffs, temp.Length - tempOffs);
|
||||||
|
Array.Copy(temp, tempOffs, buff.Bytes, buffOffs, chunk);
|
||||||
|
buffOffs += chunk;
|
||||||
|
tempOffs += chunk;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (this.nextError < this.errors.Length && this.errors[this.nextError] < _sampleOffset + buff.Length)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < PCM.BlockAlign; i++)
|
||||||
|
buff.Bytes[(this.errors[this.nextError] - _sampleOffset) * PCM.BlockAlign + i] ^= (byte)this.rnd2.Next(1, 255);
|
||||||
|
this.nextError++;
|
||||||
|
}
|
||||||
|
|
||||||
|
_sampleOffset += buff.Length;
|
||||||
|
return buff.Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Close()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Path { get { return null; } }
|
||||||
|
}
|
||||||
|
}
|
||||||
36
CUETools.TestHelpers/Properties/AssemblyInfo.cs
Normal file
36
CUETools.TestHelpers/Properties/AssemblyInfo.cs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("CUETools.TestHelpers")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("Microsoft")]
|
||||||
|
[assembly: AssemblyProduct("CUETools.TestHelpers")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("b71494d6-b658-4924-a009-d924e192550f")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||||
95
CUETools.TestHelpers/TestImageGenerator.cs
Normal file
95
CUETools.TestHelpers/TestImageGenerator.cs
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using CUETools.AccurateRip;
|
||||||
|
using CUETools.Codecs;
|
||||||
|
using CUETools.CDImage;
|
||||||
|
|
||||||
|
namespace CUETools.TestHelpers
|
||||||
|
{
|
||||||
|
public class TestImageGenerator
|
||||||
|
{
|
||||||
|
public CDImageLayout toc;
|
||||||
|
public int seed, offset, start, end, errors;
|
||||||
|
|
||||||
|
public TestImageGenerator(CDImageLayout toc, int seed, int offset, int errors, int start, int end)
|
||||||
|
{
|
||||||
|
this.toc = toc;
|
||||||
|
this.seed = seed;
|
||||||
|
this.offset = offset;
|
||||||
|
this.start = start;
|
||||||
|
this.end = end;
|
||||||
|
this.errors = errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TestImageGenerator(string trackoffsets, int seed, int offset, int errors, int start, int end)
|
||||||
|
: this (new CDImageLayout(trackoffsets), seed, offset, errors, start, end)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public TestImageGenerator(CDImageLayout toc, int seed, int offset, int errors)
|
||||||
|
: this(toc, seed, offset, errors, 0, (int)toc.AudioLength * 588)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public TestImageGenerator(string trackoffsets, int seed, int offset, int errors)
|
||||||
|
: this(new CDImageLayout(trackoffsets), seed, offset, errors)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public TestImageGenerator(TestImageGenerator copy)
|
||||||
|
{
|
||||||
|
this.toc = copy.toc;
|
||||||
|
this.seed = copy.seed;
|
||||||
|
this.offset = copy.offset;
|
||||||
|
this.start = copy.start;
|
||||||
|
this.end = copy.end;
|
||||||
|
this.errors = copy.errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Write(IAudioDest dest)
|
||||||
|
{
|
||||||
|
if (start < 0 || start > end || end > toc.AudioLength * 588)
|
||||||
|
throw new ArgumentOutOfRangeException();
|
||||||
|
var src = new NoiseAndErrorsGenerator(AudioPCMConfig.RedBook, end - start, seed, offset + start, errors);
|
||||||
|
var buff = new AudioBuffer(src, 588 * 10);
|
||||||
|
var rnd = new Random(seed);
|
||||||
|
//dest.Position = start;
|
||||||
|
while (src.Remaining > 0)
|
||||||
|
{
|
||||||
|
src.Read(buff, rnd.Next(1, buff.Size));
|
||||||
|
dest.Write(buff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccurateRipVerify CreateAccurateRipVerify()
|
||||||
|
{
|
||||||
|
var ar = new AccurateRipVerify(toc, null);
|
||||||
|
ar.Position = start;
|
||||||
|
Write(ar);
|
||||||
|
return ar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CDRepairEncode CreateCDRepairEncode(int stride, int npar, bool do_verify, bool do_encode)
|
||||||
|
{
|
||||||
|
var ar = new AccurateRipVerify(toc, null);
|
||||||
|
var encode = new CDRepairEncode(ar, stride, npar, do_verify, do_encode);
|
||||||
|
ar.Position = start;
|
||||||
|
Write(ar);
|
||||||
|
ar.Close();
|
||||||
|
return encode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AccurateRipVerify CreateAccurateRipVerify(string trackoffsets, int seed, int offset, int start, int end)
|
||||||
|
{
|
||||||
|
var generator = new TestImageGenerator(trackoffsets, seed, offset, 0, start, end);
|
||||||
|
return generator.CreateAccurateRipVerify();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AccurateRipVerify CreateAccurateRipVerify(string trackoffsets, int seed, int offset)
|
||||||
|
{
|
||||||
|
var generator = new TestImageGenerator(trackoffsets, seed, offset, 0);
|
||||||
|
return generator.CreateAccurateRipVerify();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
3
CUETools.TestHelpers/app.config
Normal file
3
CUETools.TestHelpers/app.config
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<configuration>
|
||||||
|
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
|
||||||
@@ -7,6 +7,7 @@ using System.Collections.Generic;
|
|||||||
using CUETools.CDImage;
|
using CUETools.CDImage;
|
||||||
using CUETools.AccurateRip;
|
using CUETools.AccurateRip;
|
||||||
using CUETools.Codecs;
|
using CUETools.Codecs;
|
||||||
|
using CUETools.TestHelpers;
|
||||||
namespace CUETools.TestCodecs
|
namespace CUETools.TestCodecs
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -38,25 +39,6 @@ namespace CUETools.TestCodecs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static AccurateRipVerify VerifyNoise(string trackoffsets, int seed, int offset)
|
|
||||||
{
|
|
||||||
return VerifyNoise(new CDImageLayout(trackoffsets), seed, offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static AccurateRipVerify VerifyNoise(CDImageLayout toc, int seed, int offset)
|
|
||||||
{
|
|
||||||
var src = new NoiseGenerator(AudioPCMConfig.RedBook, toc.AudioLength * 588, seed, offset);
|
|
||||||
var buff = new AudioBuffer(src, 588 * 10);
|
|
||||||
var ar = new AccurateRipVerify(toc, null);
|
|
||||||
var rnd = new Random(seed);
|
|
||||||
while (src.Remaining > 0)
|
|
||||||
{
|
|
||||||
src.Read(buff, rnd.Next(1, buff.Size));
|
|
||||||
ar.Write(buff);
|
|
||||||
}
|
|
||||||
return ar;
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Additional test attributes
|
#region Additional test attributes
|
||||||
//
|
//
|
||||||
//You can use the following additional attributes as you write your tests:
|
//You can use the following additional attributes as you write your tests:
|
||||||
@@ -80,8 +62,8 @@ namespace CUETools.TestCodecs
|
|||||||
[TestInitialize()]
|
[TestInitialize()]
|
||||||
public void MyTestInitialize()
|
public void MyTestInitialize()
|
||||||
{
|
{
|
||||||
ar = VerifyNoise("13 68 99 136", 2314, 0);
|
ar = TestImageGenerator.CreateAccurateRipVerify("13 68 99 136", 2314, 0);
|
||||||
ar2 = VerifyNoise("0 136 886", 2314, 0);
|
ar2 = TestImageGenerator.CreateAccurateRipVerify("0 136 886", 2314, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Use TestCleanup to run code after each test has run
|
//Use TestCleanup to run code after each test has run
|
||||||
@@ -168,10 +150,11 @@ namespace CUETools.TestCodecs
|
|||||||
[TestMethod()]
|
[TestMethod()]
|
||||||
public void CRCTestOffset()
|
public void CRCTestOffset()
|
||||||
{
|
{
|
||||||
var ar0 = VerifyNoise("13 68 99 136", 723722, 0);
|
var ar0 = TestImageGenerator.CreateAccurateRipVerify("13 68 99 136", 723722, 0);
|
||||||
for (int offs = 1; offs < 588 * 5; offs += 17)
|
var offsets = new int[] { 1, 2, 3, 4, 11, 256, 588, 588 * 5 - 1 };
|
||||||
|
foreach (int offs in offsets)
|
||||||
{
|
{
|
||||||
var ar1 = VerifyNoise("13 68 99 136", 723722, offs);
|
var ar1 = TestImageGenerator.CreateAccurateRipVerify("13 68 99 136", 723722, offs);
|
||||||
for (int track = 0; track < 3; track++)
|
for (int track = 0; track < 3; track++)
|
||||||
{
|
{
|
||||||
Assert.AreEqual<uint>(ar0.CRC(track, offs), ar1.CRC(track), "CRC with offset " + offs + " was not set correctly.");
|
Assert.AreEqual<uint>(ar0.CRC(track, offs), ar1.CRC(track), "CRC with offset " + offs + " was not set correctly.");
|
||||||
@@ -183,6 +166,39 @@ namespace CUETools.TestCodecs
|
|||||||
if (track != 0)
|
if (track != 0)
|
||||||
Assert.AreEqual<uint>(ar0.CRC32(track + 1), ar1.CRC32(track + 1, -offs), "CRC32 with offset " + (-offs) + " was not set correctly.");
|
Assert.AreEqual<uint>(ar0.CRC32(track + 1), ar1.CRC32(track + 1, -offs), "CRC32 with offset " + (-offs) + " was not set correctly.");
|
||||||
}
|
}
|
||||||
|
Assert.AreEqual<uint>(ar0.CTDBCRC(2 * 588 * 5, 2 * 588 * 5), ar1.CTDBCRC(2 * 588 * 5 - offs * 2, 2 * 588 * 5 + offs * 2), "CTDBCRC with offset " + offs + " was not set correctly.");
|
||||||
|
Assert.AreEqual<uint>(ar1.CTDBCRC(2 * 588 * 5, 2 * 588 * 5), ar0.CTDBCRC(2 * 588 * 5 + offs * 2, 2 * 588 * 5 - offs * 2), "CTDBCRC with offset " + (-offs) + " was not set correctly.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///A test for CRC parralelism
|
||||||
|
///</summary>
|
||||||
|
[TestMethod()]
|
||||||
|
public void CRCTestSplit()
|
||||||
|
{
|
||||||
|
var ar0 = TestImageGenerator.CreateAccurateRipVerify("13 68 99 136", 723722, 0);
|
||||||
|
var splits = new int[] { 1, 13 * 588 - 1, 13 * 588, 13 * 588 + 1, 30 * 588, 68 * 588 - 1, 68 * 588, 68 * 588 + 1 };
|
||||||
|
foreach (int split in splits)
|
||||||
|
{
|
||||||
|
var ar1 = TestImageGenerator.CreateAccurateRipVerify("13 68 99 136", 723722, 0, 0, split);
|
||||||
|
var ar2 = TestImageGenerator.CreateAccurateRipVerify("13 68 99 136", 723722, 0, split, (int)ar0.FinalSampleCount);
|
||||||
|
ar1.Combine(ar2, split, (int)ar0.FinalSampleCount);
|
||||||
|
var offsets = new int[] { 0, -1, 1, -2, 2, -3, 3, -4, 4, -11, 11, -256, 256, -588, 588, 1 - 588 * 5, 588 * 5 - 1 };
|
||||||
|
foreach (int offs in offsets)
|
||||||
|
{
|
||||||
|
for (int track = 0; track < 3; track++)
|
||||||
|
{
|
||||||
|
string message = "split = " + CDImageLayout.TimeToString((uint)split/588) + "." + (split%588).ToString() + ", offset = " + offs.ToString() + ", track = " + (track + 1).ToString();
|
||||||
|
Assert.AreEqual<uint>(ar0.CRC(track, offs), ar1.CRC(track, offs), "CRC was not set correctly, " + message);
|
||||||
|
Assert.AreEqual<uint>(ar0.CRC450(track, offs), ar1.CRC450(track, offs), "CRC450 was not set correctly, " + message);
|
||||||
|
if ((track != 2 || offs <= 0) && (track != 0 || offs >= 0))
|
||||||
|
{
|
||||||
|
Assert.AreEqual<uint>(ar0.CRC32(track + 1, offs), ar1.CRC32(track + 1, offs), "CRC32 was not set correctly, " + message);
|
||||||
|
Assert.AreEqual<uint>(ar0.CRCWONULL(track + 1, offs), ar1.CRCWONULL(track + 1, offs), "CRCWONULL was not set correctly, " + message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,7 +244,7 @@ namespace CUETools.TestCodecs
|
|||||||
public void OffsetSafeCRCRecordTest()
|
public void OffsetSafeCRCRecordTest()
|
||||||
{
|
{
|
||||||
//OffsetSafeCRCRecord[] records = new OffsetSafeCRCRecord[5000];
|
//OffsetSafeCRCRecord[] records = new OffsetSafeCRCRecord[5000];
|
||||||
var record0 = VerifyNoise("13 68 99 136", 2314, 0).OffsetSafeCRC;
|
var record0 = TestImageGenerator.CreateAccurateRipVerify("13 68 99 136", 2314, 0).OffsetSafeCRC;
|
||||||
|
|
||||||
Assert.AreEqual(
|
Assert.AreEqual(
|
||||||
"8+lTDqEZidfayuC0LoxnL9Oluf4ywo1muFBu115XBgf254fKIdfVWZOcsQraS4eI\r\n" +
|
"8+lTDqEZidfayuC0LoxnL9Oluf4ywo1muFBu115XBgf254fKIdfVWZOcsQraS4eI\r\n" +
|
||||||
@@ -242,11 +258,12 @@ namespace CUETools.TestCodecs
|
|||||||
"96ZJS2aBroYAw2We5RC2oekmi+N75L6+eQB/4iZOxB9aGP1sALd/UZaJqZP8FcmW\r\n" +
|
"96ZJS2aBroYAw2We5RC2oekmi+N75L6+eQB/4iZOxB9aGP1sALd/UZaJqZP8FcmW\r\n" +
|
||||||
"FJOXlBi/KW68TJvujz+2w/P7EaZ0L7llQAtoHwoJniuNN5WYXBlescGc+vyYr5df\r\n" +
|
"FJOXlBi/KW68TJvujz+2w/P7EaZ0L7llQAtoHwoJniuNN5WYXBlescGc+vyYr5df\r\n" +
|
||||||
"jrul+QMmQ4xMi10mglq7CMLVfZZFFgBdvGBrn1tL9bg=\r\n",
|
"jrul+QMmQ4xMi10mglq7CMLVfZZFFgBdvGBrn1tL9bg=\r\n",
|
||||||
VerifyNoise("13 68 99 136", 2314, 13).OffsetSafeCRC.Base64);
|
TestImageGenerator.CreateAccurateRipVerify("13 68 99 136", 2314, 13).OffsetSafeCRC.Base64);
|
||||||
|
|
||||||
for (int offset = 0; offset < 5000; offset += (offset < 256 ? 1 : 37))
|
var offsets = new int[] { 1, 2, 3, 4, 8, 11, 15, 16, 31, 32, 255, 256, 597, 588, 588 * 5 - 1, 588 * 5, 4095, 4096, 4097, 5000 };
|
||||||
|
foreach (int offset in offsets)
|
||||||
{
|
{
|
||||||
var record = VerifyNoise("13 68 99 136", 2314, offset).OffsetSafeCRC;
|
var record = TestImageGenerator.CreateAccurateRipVerify("13 68 99 136", 2314, offset).OffsetSafeCRC;
|
||||||
|
|
||||||
int real_off = -offset;
|
int real_off = -offset;
|
||||||
int off;
|
int off;
|
||||||
|
|||||||
@@ -97,6 +97,10 @@
|
|||||||
<Project>{D2700165-3E77-4B28-928D-551F5FC11954}</Project>
|
<Project>{D2700165-3E77-4B28-928D-551F5FC11954}</Project>
|
||||||
<Name>CUETools.Ripper</Name>
|
<Name>CUETools.Ripper</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\CUETools.TestHelpers\CUETools.TestHelpers.csproj">
|
||||||
|
<Project>{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}</Project>
|
||||||
|
<Name>CUETools.TestHelpers</Name>
|
||||||
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\..\Freedb\Freedb.csproj">
|
<ProjectReference Include="..\..\Freedb\Freedb.csproj">
|
||||||
<Project>{5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}</Project>
|
<Project>{5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}</Project>
|
||||||
<Name>Freedb</Name>
|
<Name>Freedb</Name>
|
||||||
|
|||||||
@@ -3,11 +3,10 @@ using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|||||||
using CUETools.Codecs;
|
using CUETools.Codecs;
|
||||||
using CUETools.CDImage;
|
using CUETools.CDImage;
|
||||||
using CUETools.AccurateRip;
|
using CUETools.AccurateRip;
|
||||||
|
using CUETools.TestHelpers;
|
||||||
|
|
||||||
namespace CUETools.TestParity
|
namespace CUETools.TestParity
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///This is a test class for CDRepairDecodeTest and is intended
|
///This is a test class for CDRepairDecodeTest and is intended
|
||||||
///to contain all CDRepairDecodeTest Unit Tests
|
///to contain all CDRepairDecodeTest Unit Tests
|
||||||
@@ -15,23 +14,27 @@ namespace CUETools.TestParity
|
|||||||
[TestClass()]
|
[TestClass()]
|
||||||
public class CDRepairDecodeTest
|
public class CDRepairDecodeTest
|
||||||
{
|
{
|
||||||
|
// CD has maximum of 360.000 sectors;
|
||||||
const int finalSampleCount = 44100 * 60 * 10; // 10 minutes long
|
// If stride equals 10 sectors (10 sectors * 588 samples * 2 words),
|
||||||
//const int stride = finalSampleCount * 2 / 32768;
|
// then maximum sequence length is 36.000 sectors.
|
||||||
|
// 36.000 is less than (65535 - npar), so we're ok here.
|
||||||
|
// npar == 8 provides error correction for 4 samples out of every 36k,
|
||||||
|
// i.e. at best one sample per 9k can be repaired.
|
||||||
|
// Parity data per one CD requires 10 * 588 * 4 * npar bytes,
|
||||||
|
// which equals 188.160b == 184kb
|
||||||
|
// We might consider shorter strides to reduce parity data size,
|
||||||
|
// but it probably should still be a multiple of 588 * 2;
|
||||||
|
// (or the size of CD CIRC buffer?)
|
||||||
const int stride = 10 * 588 * 2;
|
const int stride = 10 * 588 * 2;
|
||||||
const int npar = 8;
|
const int npar = 8;
|
||||||
static byte[] wav = new byte[finalSampleCount * 4];
|
const int errors = stride / 4;
|
||||||
static byte[] wav2 = new byte[finalSampleCount * 4];
|
|
||||||
static byte[] wav3 = new byte[finalSampleCount * 4];
|
|
||||||
static byte[] parity;
|
|
||||||
static uint crc;
|
|
||||||
const int offset = 48;
|
const int offset = 48;
|
||||||
static AccurateRipVerify ar;
|
const int seed = 2423;
|
||||||
static CDImageLayout toc;
|
|
||||||
static CDImageLayout toc2;
|
|
||||||
//const int offset = 5 * 588 - 5;
|
//const int offset = 5 * 588 - 5;
|
||||||
//const int offset = 2000;
|
//const int offset = 2000;
|
||||||
|
|
||||||
|
private static TestImageGenerator generator;
|
||||||
|
private static CDRepairEncode encode;
|
||||||
private TestContext testContextInstance;
|
private TestContext testContextInstance;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -58,24 +61,8 @@ namespace CUETools.TestParity
|
|||||||
[ClassInitialize()]
|
[ClassInitialize()]
|
||||||
public static void MyClassInitialize(TestContext testContext)
|
public static void MyClassInitialize(TestContext testContext)
|
||||||
{
|
{
|
||||||
toc = new CDImageLayout(1, 1, 1, string.Format("0 {0}", (finalSampleCount / 588).ToString()));
|
generator = new TestImageGenerator("0 9801", seed, 32 * 588, 0);
|
||||||
toc2 = new CDImageLayout(1, 1, 1, string.Format("32 {0}", (32 + finalSampleCount / 588).ToString()));
|
encode = generator.CreateCDRepairEncode(stride, npar, false, true);
|
||||||
ar = new AccurateRipVerify(toc, null);
|
|
||||||
|
|
||||||
new Random(2423).NextBytes(wav);
|
|
||||||
new Random(2423).NextBytes(wav2);
|
|
||||||
Random rnd = new Random(987);
|
|
||||||
for (int i = 0; i < stride / 4; i++)
|
|
||||||
wav2[(int)(rnd.NextDouble() * (wav2.Length - 1))] = (byte)(rnd.NextDouble() * 255);
|
|
||||||
|
|
||||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
|
||||||
CDRepairEncode encode = new CDRepairEncode(ar, stride, npar, false, true);
|
|
||||||
buff.Prepare(wav, finalSampleCount);
|
|
||||||
ar.Init(toc);
|
|
||||||
ar.Write(buff);
|
|
||||||
ar.Close();
|
|
||||||
parity = encode.Parity;
|
|
||||||
crc = encode.CRC;
|
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
//Use ClassCleanup to run code after all tests in a class have run
|
//Use ClassCleanup to run code after all tests in a class have run
|
||||||
@@ -98,6 +85,15 @@ namespace CUETools.TestParity
|
|||||||
//
|
//
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///A test for Write
|
||||||
|
///</summary>
|
||||||
|
[TestMethod()]
|
||||||
|
public void CDRepairEncodeWriteTest()
|
||||||
|
{
|
||||||
|
Assert.AreEqual<string>("jvR9QJ1cSWo=", Convert.ToBase64String(encode.Parity, 0, 8));
|
||||||
|
Assert.AreEqual<uint>(377539636, encode.CRC);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///Verifying rip that is accurate
|
///Verifying rip that is accurate
|
||||||
@@ -105,15 +101,10 @@ namespace CUETools.TestParity
|
|||||||
[TestMethod()]
|
[TestMethod()]
|
||||||
public void CDRepairDecodeOriginalTest()
|
public void CDRepairDecodeOriginalTest()
|
||||||
{
|
{
|
||||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
var decode = generator.CreateCDRepairEncode(stride, npar, true, false);
|
||||||
CDRepairEncode decode = new CDRepairEncode(ar, stride, npar, true, false);
|
|
||||||
buff.Prepare(wav, finalSampleCount);
|
|
||||||
ar.Init(toc);
|
|
||||||
ar.Write(buff);
|
|
||||||
ar.Close();
|
|
||||||
int actualOffset;
|
int actualOffset;
|
||||||
bool hasErrors;
|
bool hasErrors;
|
||||||
Assert.IsTrue(decode.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors));
|
Assert.IsTrue(decode.FindOffset(encode.NPAR, encode.Parity, 0, encode.CRC, out actualOffset, out hasErrors));
|
||||||
Assert.IsFalse(hasErrors, "has errors");
|
Assert.IsFalse(hasErrors, "has errors");
|
||||||
Assert.AreEqual(0, actualOffset, "wrong offset");
|
Assert.AreEqual(0, actualOffset, "wrong offset");
|
||||||
}
|
}
|
||||||
@@ -124,20 +115,14 @@ namespace CUETools.TestParity
|
|||||||
[TestMethod()]
|
[TestMethod()]
|
||||||
public void CDRepairDecodeOriginalWithPregapTest()
|
public void CDRepairDecodeOriginalWithPregapTest()
|
||||||
{
|
{
|
||||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
var generator2 = new TestImageGenerator("32 9833", seed, 0, 0);
|
||||||
ar.Init(toc2);
|
var decode = generator2.CreateCDRepairEncode(stride, npar, true, false);
|
||||||
CDRepairEncode decode = new CDRepairEncode(ar, stride, npar, true, false);
|
|
||||||
buff.Prepare(wav, (int)toc2.Pregap * 588);
|
|
||||||
ar.Write(buff);
|
|
||||||
buff.Prepare(wav, finalSampleCount);
|
|
||||||
ar.Write(buff);
|
|
||||||
ar.Close();
|
|
||||||
int actualOffset;
|
int actualOffset;
|
||||||
bool hasErrors;
|
bool hasErrors;
|
||||||
Assert.IsTrue(decode.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors));
|
Assert.IsTrue(decode.FindOffset(encode.NPAR, encode.Parity, 0, encode.CRC, out actualOffset, out hasErrors));
|
||||||
Assert.IsTrue(hasErrors, "doesn't have errors");
|
Assert.IsTrue(hasErrors, "doesn't have errors");
|
||||||
Assert.AreEqual(-1176, actualOffset, "wrong offset");
|
Assert.AreEqual(-1176, actualOffset, "wrong offset");
|
||||||
CDRepairFix fix = decode.VerifyParity(parity, actualOffset);
|
CDRepairFix fix = decode.VerifyParity(encode.Parity, actualOffset);
|
||||||
Assert.IsTrue(fix.HasErrors, "doesn't have errors");
|
Assert.IsTrue(fix.HasErrors, "doesn't have errors");
|
||||||
Assert.IsTrue(fix.CanRecover, "cannot recover");
|
Assert.IsTrue(fix.CanRecover, "cannot recover");
|
||||||
}
|
}
|
||||||
@@ -148,20 +133,18 @@ namespace CUETools.TestParity
|
|||||||
[TestMethod()]
|
[TestMethod()]
|
||||||
public void CDRepairDecodeModifiedTest()
|
public void CDRepairDecodeModifiedTest()
|
||||||
{
|
{
|
||||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
var generator2 = new TestImageGenerator("0 9801", seed, 32 * 588, errors);
|
||||||
CDRepairEncode decode = new CDRepairEncode(ar, stride, npar, true, false);
|
var decode = generator2.CreateCDRepairEncode(stride, npar, true, false);
|
||||||
buff.Prepare(wav2, finalSampleCount);
|
|
||||||
ar.Init(toc);
|
|
||||||
ar.Write(buff);
|
|
||||||
ar.Close();
|
|
||||||
int actualOffset;
|
int actualOffset;
|
||||||
bool hasErrors;
|
bool hasErrors;
|
||||||
Assert.IsTrue(decode.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors));
|
Assert.IsTrue(decode.FindOffset(encode.NPAR, encode.Parity, 0, encode.CRC, out actualOffset, out hasErrors));
|
||||||
Assert.IsTrue(hasErrors, "doesn't have errors");
|
Assert.IsTrue(hasErrors, "doesn't have errors");
|
||||||
Assert.AreEqual(0, actualOffset, "wrong offset");
|
Assert.AreEqual(0, actualOffset, "wrong offset");
|
||||||
CDRepairFix fix = decode.VerifyParity(parity, actualOffset);
|
CDRepairFix fix = decode.VerifyParity(encode.Parity, actualOffset);
|
||||||
Assert.IsTrue(fix.HasErrors, "doesn't have errors");
|
Assert.IsTrue(fix.HasErrors, "doesn't have errors");
|
||||||
Assert.IsTrue(fix.CanRecover, "cannot recover");
|
Assert.IsTrue(fix.CanRecover, "cannot recover");
|
||||||
|
generator2.Write(fix);
|
||||||
|
Assert.AreEqual<uint>(encode.CRC, fix.CRC);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -170,16 +153,11 @@ namespace CUETools.TestParity
|
|||||||
[TestMethod()]
|
[TestMethod()]
|
||||||
public void CDRepairDecodePositiveOffsetTest()
|
public void CDRepairDecodePositiveOffsetTest()
|
||||||
{
|
{
|
||||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
var generator2 = new TestImageGenerator("0 9801", seed, 32 * 588 + offset, 0);
|
||||||
CDRepairEncode decode = new CDRepairEncode(ar, stride, npar, true, false);
|
var decode = generator2.CreateCDRepairEncode(stride, npar, true, false);
|
||||||
Array.Copy(wav, offset * 4, wav3, 0, (finalSampleCount - offset) * 4);
|
|
||||||
buff.Prepare(wav3, finalSampleCount);
|
|
||||||
ar.Init(toc);
|
|
||||||
ar.Write(buff);
|
|
||||||
ar.Close();
|
|
||||||
int actualOffset;
|
int actualOffset;
|
||||||
bool hasErrors;
|
bool hasErrors;
|
||||||
Assert.IsTrue(decode.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors));
|
Assert.IsTrue(decode.FindOffset(encode.NPAR, encode.Parity, 0, encode.CRC, out actualOffset, out hasErrors));
|
||||||
Assert.IsFalse(hasErrors, "has errors");
|
Assert.IsFalse(hasErrors, "has errors");
|
||||||
Assert.AreEqual(offset, actualOffset, "wrong offset");
|
Assert.AreEqual(offset, actualOffset, "wrong offset");
|
||||||
}
|
}
|
||||||
@@ -190,17 +168,11 @@ namespace CUETools.TestParity
|
|||||||
[TestMethod()]
|
[TestMethod()]
|
||||||
public void CDRepairDecodeNegativeOffsetTest()
|
public void CDRepairDecodeNegativeOffsetTest()
|
||||||
{
|
{
|
||||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
var generator2 = new TestImageGenerator("0 9801", seed, 32 * 588 - offset, 0);
|
||||||
CDRepairEncode decode = new CDRepairEncode(ar, stride, npar, true, false);
|
var decode = generator2.CreateCDRepairEncode(stride, npar, true, false);
|
||||||
ar.Init(toc);
|
|
||||||
buff.Prepare(new byte[offset * 4], offset);
|
|
||||||
ar.Write(buff);
|
|
||||||
buff.Prepare(wav, finalSampleCount - offset);
|
|
||||||
ar.Write(buff);
|
|
||||||
ar.Close();
|
|
||||||
int actualOffset;
|
int actualOffset;
|
||||||
bool hasErrors;
|
bool hasErrors;
|
||||||
Assert.IsTrue(decode.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors));
|
Assert.IsTrue(decode.FindOffset(encode.NPAR, encode.Parity, 0, encode.CRC, out actualOffset, out hasErrors));
|
||||||
Assert.IsFalse(hasErrors, "has errors");
|
Assert.IsFalse(hasErrors, "has errors");
|
||||||
Assert.AreEqual(-offset, actualOffset, "wrong offset");
|
Assert.AreEqual(-offset, actualOffset, "wrong offset");
|
||||||
}
|
}
|
||||||
@@ -211,21 +183,18 @@ namespace CUETools.TestParity
|
|||||||
[TestMethod()]
|
[TestMethod()]
|
||||||
public void CDRepairDecodePositiveOffsetErrorsTest()
|
public void CDRepairDecodePositiveOffsetErrorsTest()
|
||||||
{
|
{
|
||||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
var generator2 = new TestImageGenerator("0 9801", seed, 32 * 588 + offset, errors);
|
||||||
CDRepairEncode decode = new CDRepairEncode(ar, stride, npar, true, false);
|
var decode = generator2.CreateCDRepairEncode(stride, npar, true, false);
|
||||||
Array.Copy(wav2, offset * 4, wav3, 0, (finalSampleCount - offset) * 4);
|
|
||||||
buff.Prepare(wav3, finalSampleCount);
|
|
||||||
ar.Init(toc);
|
|
||||||
ar.Write(buff);
|
|
||||||
ar.Close();
|
|
||||||
int actualOffset;
|
int actualOffset;
|
||||||
bool hasErrors;
|
bool hasErrors;
|
||||||
Assert.IsTrue(decode.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors));
|
Assert.IsTrue(decode.FindOffset(encode.NPAR, encode.Parity, 0, encode.CRC, out actualOffset, out hasErrors));
|
||||||
Assert.IsTrue(hasErrors, "doesn't have errors");
|
Assert.IsTrue(hasErrors, "doesn't have errors");
|
||||||
Assert.AreEqual(offset, actualOffset, "wrong offset");
|
Assert.AreEqual(offset, actualOffset, "wrong offset");
|
||||||
CDRepairFix fix = decode.VerifyParity(parity, actualOffset);
|
CDRepairFix fix = decode.VerifyParity(encode.Parity, actualOffset);
|
||||||
Assert.IsTrue(fix.HasErrors, "doesn't have errors");
|
Assert.IsTrue(fix.HasErrors, "doesn't have errors");
|
||||||
Assert.IsTrue(fix.CanRecover, "cannot recover");
|
Assert.IsTrue(fix.CanRecover, "cannot recover");
|
||||||
|
generator2.Write(fix);
|
||||||
|
Assert.AreEqual<uint>(encode.CRC, fix.CRC);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -234,22 +203,18 @@ namespace CUETools.TestParity
|
|||||||
[TestMethod()]
|
[TestMethod()]
|
||||||
public void CDRepairDecodeNegativeOffsetErrorsTest()
|
public void CDRepairDecodeNegativeOffsetErrorsTest()
|
||||||
{
|
{
|
||||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
var generator2 = new TestImageGenerator("0 9801", seed, 32 * 588 - offset, errors);
|
||||||
CDRepairEncode decode = new CDRepairEncode(ar, stride, npar, true, false);
|
var decode = generator2.CreateCDRepairEncode(stride, npar, true, false);
|
||||||
ar.Init(toc);
|
|
||||||
buff.Prepare(new byte[offset * 4], offset);
|
|
||||||
ar.Write(buff);
|
|
||||||
buff.Prepare(wav2, finalSampleCount - offset);
|
|
||||||
ar.Write(buff);
|
|
||||||
ar.Close();
|
|
||||||
int actualOffset;
|
int actualOffset;
|
||||||
bool hasErrors;
|
bool hasErrors;
|
||||||
Assert.IsTrue(decode.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors));
|
Assert.IsTrue(decode.FindOffset(encode.NPAR, encode.Parity, 0, encode.CRC, out actualOffset, out hasErrors));
|
||||||
Assert.IsTrue(hasErrors, "doesn't have errors");
|
Assert.IsTrue(hasErrors, "doesn't have errors");
|
||||||
Assert.AreEqual(-offset, actualOffset, "wrong offset");
|
Assert.AreEqual(-offset, actualOffset, "wrong offset");
|
||||||
CDRepairFix fix = decode.VerifyParity(parity, actualOffset);
|
CDRepairFix fix = decode.VerifyParity(encode.Parity, actualOffset);
|
||||||
Assert.IsTrue(fix.HasErrors, "doesn't have errors");
|
Assert.IsTrue(fix.HasErrors, "doesn't have errors");
|
||||||
Assert.IsTrue(fix.CanRecover, "cannot recover");
|
Assert.IsTrue(fix.CanRecover, "cannot recover");
|
||||||
|
generator2.Write(fix);
|
||||||
|
Assert.AreEqual<uint>(encode.CRC, fix.CRC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,9 +32,6 @@ namespace CUETools.TestParity
|
|||||||
// (or the size of CD CIRC buffer?)
|
// (or the size of CD CIRC buffer?)
|
||||||
|
|
||||||
const int npar = 8;
|
const int npar = 8;
|
||||||
static byte[] wav = new byte[finalSampleCount * 4];
|
|
||||||
static AccurateRipVerify ar;
|
|
||||||
static CDImageLayout toc;
|
|
||||||
|
|
||||||
private TestContext testContextInstance;
|
private TestContext testContextInstance;
|
||||||
|
|
||||||
@@ -54,6 +51,31 @@ namespace CUETools.TestParity
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static CDRepairEncode VerifyNoise(CDImageLayout toc, int seed, int offset, int start, int end, int errors, bool do_verify, bool do_encode)
|
||||||
|
{
|
||||||
|
if (start < 0 || start > end || end > toc.AudioLength * 588)
|
||||||
|
throw new ArgumentOutOfRangeException();
|
||||||
|
var src = new NoiseAndErrorsGenerator(AudioPCMConfig.RedBook, end - start, seed, offset + start, errors);
|
||||||
|
var buff = new AudioBuffer(src, 588 * 100);
|
||||||
|
var ar = new AccurateRipVerify(toc, null);
|
||||||
|
var encode = new CDRepairEncode(ar, stride, npar, do_verify, do_encode);
|
||||||
|
var rnd = new Random(seed);
|
||||||
|
ar.Position = start;
|
||||||
|
while (src.Remaining > 0)
|
||||||
|
{
|
||||||
|
src.Read(buff, rnd.Next(1, buff.Size));
|
||||||
|
ar.Write(buff);
|
||||||
|
}
|
||||||
|
ar.Close();
|
||||||
|
return encode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CDRepairEncode VerifyNoise(string trackoffsets, int seed, int offset, int errors, bool do_verify, bool do_encode)
|
||||||
|
{
|
||||||
|
var toc = new CDImageLayout(trackoffsets);
|
||||||
|
return VerifyNoise(toc, seed, offset, 0, (int)toc.AudioLength * 588, errors, do_verify, do_encode);
|
||||||
|
}
|
||||||
|
|
||||||
#region Additional test attributes
|
#region Additional test attributes
|
||||||
//
|
//
|
||||||
//You can use the following additional attributes as you write your tests:
|
//You can use the following additional attributes as you write your tests:
|
||||||
@@ -62,9 +84,6 @@ namespace CUETools.TestParity
|
|||||||
[ClassInitialize()]
|
[ClassInitialize()]
|
||||||
public static void MyClassInitialize(TestContext testContext)
|
public static void MyClassInitialize(TestContext testContext)
|
||||||
{
|
{
|
||||||
toc = new CDImageLayout(1, 1, 1, string.Format("0 {0}", (finalSampleCount / 588).ToString()));
|
|
||||||
ar = new AccurateRipVerify(toc, null);
|
|
||||||
new Random(2423).NextBytes(wav);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Use ClassCleanup to run code after all tests in a class have run
|
//Use ClassCleanup to run code after all tests in a class have run
|
||||||
@@ -94,13 +113,8 @@ namespace CUETools.TestParity
|
|||||||
[TestMethod()]
|
[TestMethod()]
|
||||||
public void CDRepairEncodeWriteTest()
|
public void CDRepairEncodeWriteTest()
|
||||||
{
|
{
|
||||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
var encode = VerifyNoise("0 45000", 2423, 0, 0, false, true);
|
||||||
CDRepairEncode encode = new CDRepairEncode(ar, stride, npar, false, true);
|
Assert.AreEqual<string>("CAz3OBAHPAw=", Convert.ToBase64String(encode.Parity, 0, 8));
|
||||||
buff.Prepare(wav, finalSampleCount);
|
|
||||||
ar.Init(toc);
|
|
||||||
ar.Write(buff);
|
|
||||||
ar.Close();
|
|
||||||
Assert.AreEqual<byte>(8, encode.Parity[0]);
|
|
||||||
Assert.AreEqual<uint>(2278257733, encode.CRC);
|
Assert.AreEqual<uint>(2278257733, encode.CRC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,11 @@
|
|||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
<RootNamespace>CUETools.TestParity</RootNamespace>
|
<RootNamespace>CUETools.TestParity</RootNamespace>
|
||||||
<AssemblyName>CUETools.TestParity</AssemblyName>
|
<AssemblyName>CUETools.TestParity</AssemblyName>
|
||||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||||
|
<TargetFrameworkSubset>
|
||||||
|
</TargetFrameworkSubset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
@@ -24,25 +26,20 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>false</Optimize>
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
|
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core">
|
|
||||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System.Data" />
|
<Reference Include="System.Data" />
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="CDRepairDecodeTest.cs" />
|
<Compile Include="CDRepairDecodeTest.cs" />
|
||||||
<Compile Include="CDRepairEncodeTest.cs" />
|
|
||||||
<Compile Include="CDRepairTest.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="RsDecode16Test.cs" />
|
<Compile Include="RsDecode16Test.cs" />
|
||||||
<Compile Include="RsDecodeTest.cs" />
|
<Compile Include="RsDecodeTest.cs" />
|
||||||
@@ -66,6 +63,13 @@
|
|||||||
<Project>{ECEB839C-171B-4535-958F-9899310A0342}</Project>
|
<Project>{ECEB839C-171B-4535-958F-9899310A0342}</Project>
|
||||||
<Name>CUETools.Parity</Name>
|
<Name>CUETools.Parity</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\CUETools.TestHelpers\CUETools.TestHelpers.csproj">
|
||||||
|
<Project>{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}</Project>
|
||||||
|
<Name>CUETools.TestHelpers</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="app.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
|||||||
@@ -179,6 +179,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Interop", "Interop", "{86BB
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.CTDB.EACPlugin", "..\CUETools.CTDB.EACPlugin\CUETools.CTDB.EACPlugin.csproj", "{816D964C-9772-46C5-AF1D-49E8C78A1E7C}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.CTDB.EACPlugin", "..\CUETools.CTDB.EACPlugin\CUETools.CTDB.EACPlugin.csproj", "{816D964C-9772-46C5-AF1D-49E8C78A1E7C}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.TestHelpers", "..\CUETools.TestHelpers\CUETools.TestHelpers.csproj", "{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(TestCaseManagementSettings) = postSolution
|
GlobalSection(TestCaseManagementSettings) = postSolution
|
||||||
CategoryFile = CUETools1.vsmdi
|
CategoryFile = CUETools1.vsmdi
|
||||||
@@ -1036,6 +1038,20 @@ Global
|
|||||||
{816D964C-9772-46C5-AF1D-49E8C78A1E7C}.Release|Win32.ActiveCfg = Release|Any CPU
|
{816D964C-9772-46C5-AF1D-49E8C78A1E7C}.Release|Win32.ActiveCfg = Release|Any CPU
|
||||||
{816D964C-9772-46C5-AF1D-49E8C78A1E7C}.Release|x64.ActiveCfg = Release|Any CPU
|
{816D964C-9772-46C5-AF1D-49E8C78A1E7C}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{816D964C-9772-46C5-AF1D-49E8C78A1E7C}.Release|x86.ActiveCfg = Release|Any CPU
|
{816D964C-9772-46C5-AF1D-49E8C78A1E7C}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}.Debug|Win32.ActiveCfg = Debug|Any CPU
|
||||||
|
{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}.Release|Win32.ActiveCfg = Release|Any CPU
|
||||||
|
{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{84EBB7CB-02C9-40A9-9D32-C641B822DAA2}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
@@ -1078,6 +1094,7 @@ Global
|
|||||||
{A430AD28-B76A-4ED0-AF7D-D13B8969297F} = {D9D97BB6-002F-4858-8EF2-49B4C4C4DDB4}
|
{A430AD28-B76A-4ED0-AF7D-D13B8969297F} = {D9D97BB6-002F-4858-8EF2-49B4C4C4DDB4}
|
||||||
{5C8B61C0-BC3D-4316-B8A7-419D55BB5796} = {D9D97BB6-002F-4858-8EF2-49B4C4C4DDB4}
|
{5C8B61C0-BC3D-4316-B8A7-419D55BB5796} = {D9D97BB6-002F-4858-8EF2-49B4C4C4DDB4}
|
||||||
{6C74652F-1EF4-459E-84F4-99D93D3D17DA} = {D9D97BB6-002F-4858-8EF2-49B4C4C4DDB4}
|
{6C74652F-1EF4-459E-84F4-99D93D3D17DA} = {D9D97BB6-002F-4858-8EF2-49B4C4C4DDB4}
|
||||||
|
{84EBB7CB-02C9-40A9-9D32-C641B822DAA2} = {D9D97BB6-002F-4858-8EF2-49B4C4C4DDB4}
|
||||||
{B75FA7AD-968E-4990-B342-1B4B17C850DF} = {B36BE134-D85A-437E-AB61-2DA1CCDE06C1}
|
{B75FA7AD-968E-4990-B342-1B4B17C850DF} = {B36BE134-D85A-437E-AB61-2DA1CCDE06C1}
|
||||||
{F2DFEB00-BB35-4665-85EA-CB8C7729A6B7} = {B36BE134-D85A-437E-AB61-2DA1CCDE06C1}
|
{F2DFEB00-BB35-4665-85EA-CB8C7729A6B7} = {B36BE134-D85A-437E-AB61-2DA1CCDE06C1}
|
||||||
{A05B6AA6-0EC3-495D-BCC4-ECE1210071A8} = {B36BE134-D85A-437E-AB61-2DA1CCDE06C1}
|
{A05B6AA6-0EC3-495D-BCC4-ECE1210071A8} = {B36BE134-D85A-437E-AB61-2DA1CCDE06C1}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
</TestList>
|
</TestList>
|
||||||
<TestList name="Results Not in a List" id="8c84fa94-04c1-424b-9868-57a2d4851a1d">
|
<TestList name="Results Not in a List" id="8c84fa94-04c1-424b-9868-57a2d4851a1d">
|
||||||
<TestLinks>
|
<TestLinks>
|
||||||
<TestLink id="707b580c-3801-a61c-0d6a-866ccb489f00" name="CDRepairFixTest" storage="cuetools.testparity\bin\debug\cuetools.testparity.dll" enabled="false" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
|
<TestLink id="707b580c-3801-a61c-0d6a-866ccb489f00" name="CDRepairFixTest" storage="cuetools.testparity\bin\release\cuetools.testparity.dll" enabled="false" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
</TestLinks>
|
</TestLinks>
|
||||||
</TestList>
|
</TestList>
|
||||||
</TestLists>
|
</TestLists>
|
||||||
Reference in New Issue
Block a user