From 94b06b7de50bf9b19120bf04f4294acaea99f9f5 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Mon, 27 Jun 2022 18:32:46 -0700 Subject: [PATCH] Changes to support barcode scanner and new CDE5 Windows 7 machine --- Adaptation/.vscode/launch.json | 2 +- .../FileHandlers/DownloadRsMFile/FileRead.cs | 32 +++- Adaptation/FileHandlers/RsM/FileRead.cs | 7 +- Adaptation/FileHandlers/RsM/ProcessData.cs | 56 +++--- Adaptation/FileHandlers/pcl/FileRead.cs | 7 +- Adaptation/FileHandlers/pcl/ProcessData.cs | 92 ++++----- Adaptation/Shared/Logistics.cs | 181 +++++++++--------- .../Shared/ProcessDataStandardFormat.cs | 2 - Adaptation/Shared/Properties/ILogistics.cs | 21 +- .../Staging/v2.43.3/CDE5-EQPT.cs | 60 ++++++ .../Staging/v2.43.3/CDE5.cs | 60 ++++++ .../Extract/Staging/v2.43.3/CDE5-EQPT.cs | 41 ++++ .../_Tests/Extract/Staging/v2.43.3/CDE5.cs | 72 +++++++ Adaptation/package.json | 4 +- 14 files changed, 433 insertions(+), 204 deletions(-) create mode 100644 Adaptation/_Tests/CreateSelfDescription/Staging/v2.43.3/CDE5-EQPT.cs create mode 100644 Adaptation/_Tests/CreateSelfDescription/Staging/v2.43.3/CDE5.cs create mode 100644 Adaptation/_Tests/Extract/Staging/v2.43.3/CDE5-EQPT.cs create mode 100644 Adaptation/_Tests/Extract/Staging/v2.43.3/CDE5.cs diff --git a/Adaptation/.vscode/launch.json b/Adaptation/.vscode/launch.json index a371699..0d05475 100644 --- a/Adaptation/.vscode/launch.json +++ b/Adaptation/.vscode/launch.json @@ -4,7 +4,7 @@ "name": ".NET Core Attach", "type": "coreclr", "request": "attach", - "processId": 1796 + "processId": 21428 } ] } diff --git a/Adaptation/FileHandlers/DownloadRsMFile/FileRead.cs b/Adaptation/FileHandlers/DownloadRsMFile/FileRead.cs index d09172b..e73c9d9 100644 --- a/Adaptation/FileHandlers/DownloadRsMFile/FileRead.cs +++ b/Adaptation/FileHandlers/DownloadRsMFile/FileRead.cs @@ -12,7 +12,6 @@ using System.Linq; using System.Net.Http; using System.Text.Json; using System.Threading; -using System.Threading.Tasks; namespace Adaptation.FileHandlers.DownloadRsMFile; @@ -120,12 +119,13 @@ public class FileRead : Shared.FileRead, IFileRead throw new Exception(string.Concat("See ", nameof(Callback))); } - private async Task DownloadRsMFileAsync() + private void DownloadRsMFileAsync() { if (_HttpClient is null) throw new Exception(); if (string.IsNullOrEmpty(_StaticFileServer)) throw new Exception(); + string logUrl; string logText; string runJson; string rootJson; @@ -141,6 +141,7 @@ public class FileRead : Shared.FileRead, IFileRead string dateTimeFormat = "yy/MM/dd HH:mm:ss"; NginxFileSystem[] runNginxFileSystemCollection; NginxFileSystem[] rootNginxFileSystemCollection; + NginxFileSystem[] innerNginxFileSystemCollection; DateTime fileAgeThresholdDateTime = DateTime.Now; string nginxFormat = "ddd, dd MMM yyyy HH:mm:ss zzz"; List> possibleDownload = new(); @@ -157,13 +158,30 @@ public class FileRead : Shared.FileRead, IFileRead _ => throw new Exception(), }; } - rootJson = await _HttpClient.GetStringAsync(string.Concat("http://", _StaticFileServer)); + rootJson = _HttpClient.GetStringAsync(string.Concat("http://", _StaticFileServer)).Result; rootNginxFileSystemCollection = JsonSerializer.Deserialize(rootJson, propertyNameCaseInsensitiveJsonSerializerOptions); foreach (NginxFileSystem rootNginxFileSystem in rootNginxFileSystemCollection) { if (!(from l in _FileConnectorConfiguration.SourceFileFilters where rootNginxFileSystem.Name == l select false).Any()) continue; - logText = await _HttpClient.GetStringAsync(string.Concat("http://", _StaticFileServer, '/', rootNginxFileSystem.Name)); + logUrl = string.Empty; + if (rootNginxFileSystem.Name.Contains(".")) + logUrl = string.Concat("http://", _StaticFileServer, '/', rootNginxFileSystem.Name); + else + { + rootJson = _HttpClient.GetStringAsync(string.Concat("http://", _StaticFileServer, '/', rootNginxFileSystem.Name)).Result; + innerNginxFileSystemCollection = JsonSerializer.Deserialize(rootJson, propertyNameCaseInsensitiveJsonSerializerOptions); + foreach (NginxFileSystem innerNginxFileSystem in innerNginxFileSystemCollection) + { + if (!(from l in _FileConnectorConfiguration.SourceFileFilters where innerNginxFileSystem.Name == l select false).Any()) + continue; + logUrl = string.Concat("http://", _StaticFileServer, '/', rootNginxFileSystem.Name, '/', innerNginxFileSystem.Name); + break; + } + } + if (string.IsNullOrEmpty(logUrl)) + continue; + logText = _HttpClient.GetStringAsync(logUrl).Result; logLines = logText.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); foreach (string logLine in logLines) { @@ -182,7 +200,7 @@ public class FileRead : Shared.FileRead, IFileRead runFullFileNameSegments = runFullFileName.Split('\\').ToList(); runFileName = runFullFileNameSegments[runFullFileNameSegments.Count - 1]; runFullFileNameSegments.RemoveAt(runFullFileNameSegments.Count - 1); - runJson = await _HttpClient.GetStringAsync(string.Concat("http://", _StaticFileServer, '/', string.Join("/", runFullFileNameSegments))); + runJson = _HttpClient.GetStringAsync(string.Concat("http://", _StaticFileServer, '/', string.Join("/", runFullFileNameSegments))).Result; runFullFileNameSegments.Add(runFileName); runNginxFileSystemCollection = JsonSerializer.Deserialize(runJson, propertyNameCaseInsensitiveJsonSerializerOptions); foreach (NginxFileSystem matchNginxFileSystem in runNginxFileSystemCollection) @@ -222,7 +240,7 @@ public class FileRead : Shared.FileRead, IFileRead File.Delete(alternateFileInfo.FullName); if (targetFileInfo.Exists) File.Delete(targetFileInfo.FullName); - targetJson = await _HttpClient.GetStringAsync(targetFileName); + targetJson = _HttpClient.GetStringAsync(targetFileName).Result; File.WriteAllText(targetFileInfo.FullName, targetJson); targetFileInfo.LastWriteTime = matchNginxFileSystemDateTime; File.Copy(targetFileInfo.FullName, alternateFileInfo.FullName); @@ -234,7 +252,7 @@ public class FileRead : Shared.FileRead, IFileRead try { if (_IsEAFHosted) - _ = DownloadRsMFileAsync(); + DownloadRsMFileAsync(); } catch (Exception exception) { diff --git a/Adaptation/FileHandlers/RsM/FileRead.cs b/Adaptation/FileHandlers/RsM/FileRead.cs index f6d4902..3c6c58b 100644 --- a/Adaptation/FileHandlers/RsM/FileRead.cs +++ b/Adaptation/FileHandlers/RsM/FileRead.cs @@ -98,8 +98,8 @@ public class FileRead : Shared.FileRead, IFileRead Tuple> results = new(string.Empty, null, null, new List()); _Logistics = new Logistics(this, reportFullPath, useSplitForMID: true); SetFileParameterLotIDToLogisticsMID(); - if (reportFullPath.Length < _MinFileLength) - results.Item4.Add(new FileInfo(reportFullPath)); + if (_Logistics.FileInfo.Length < _MinFileLength) + results.Item4.Add(_Logistics.FileInfo); else { IProcessData iProcessData = new ProcessData(this, _Logistics, results.Item4); @@ -107,9 +107,8 @@ public class FileRead : Shared.FileRead, IFileRead throw new Exception(string.Concat("A) No Data - ", dateTime.Ticks)); string mid = string.Concat(processData.Reactor, "-", processData.RDS, "-", processData.PSN); mid = Regex.Replace(mid, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; - _Logistics.MID = mid; SetFileParameterLotID(mid); - _Logistics.ProcessJobID = processData.Reactor; + _Logistics.Update(mid, processData.Reactor); string logBody = processData.LogBody; if (!iProcessData.Details.Any()) throw new Exception(string.Concat("B) No Data - ", dateTime.Ticks)); diff --git a/Adaptation/FileHandlers/RsM/ProcessData.cs b/Adaptation/FileHandlers/RsM/ProcessData.cs index 459fa6d..2d8436c 100644 --- a/Adaptation/FileHandlers/RsM/ProcessData.cs +++ b/Adaptation/FileHandlers/RsM/ProcessData.cs @@ -90,24 +90,32 @@ public class ProcessData : IProcessData { if (segments.Length > 0) { - Title = segments[0]; - // Remove illegal characters \/:*?"<>| found in the Run. - Run = Regex.Replace(segments[0], @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; - string[] parsedBatch = segments[0].Split('-'); - if (parsedBatch.Length > 0) - Reactor = parsedBatch[0]; - if (parsedBatch.Length > 1) - RDS = parsedBatch[1]; - if (parsedBatch.Length > 2) + // Remove illegal characters \/:*?"<>| found in the title. + string title = Regex.Replace(segments[0], @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; + if (title.StartsWith("1T") || title.StartsWith("1t")) + title = title.Substring(2); + Title = title; + Run = title; + string[] parsedBatch = title.Split('-'); + if (parsedBatch.Length == 1) + RDS = title; + else { - string[] parsedPSN = parsedBatch[2].Split('.'); - if (parsedPSN.Length > 0) - PSN = parsedPSN[0]; - if (parsedPSN.Length > 1) - Layer = parsedPSN[1]; + if (parsedBatch.Length > 0) + Reactor = parsedBatch[0]; + if (parsedBatch.Length > 1) + RDS = parsedBatch[1]; + if (parsedBatch.Length > 2) + { + string[] parsedPSN = parsedBatch[2].Split('.'); + if (parsedPSN.Length > 0) + PSN = parsedPSN[0]; + if (parsedPSN.Length > 1) + Layer = parsedPSN[1]; + } + if (parsedBatch.Length > 3) + Zone = parsedBatch[3]; } - if (parsedBatch.Length > 3) - Zone = parsedBatch[3]; } } @@ -217,19 +225,19 @@ public class ProcessData : IProcessData for (int i = 0; i < lines.Length; i++) { segments = lines[i].Split(separator, StringSplitOptions.RemoveEmptyEntries); - if (lines[i].Contains(",")) + if (lines[i].Contains("<Title>")) SetTitleData(segments); - else if (lines[i].Contains(",<FileName, Proj,Rcpe, LotID,WfrID>")) + else if (lines[i].Contains("<FileName, Proj,Rcpe, LotID,WfrID")) SetFileNameData(segments); - else if (lines[i].Contains(",<DateTime,Temp,TCR%,N|P>")) + else if (lines[i].Contains("<DateTime,Temp,TCR%,N|P>")) SetDateTimeData(logistics, segments); - else if (lines[i].Contains(",<Operator, Epuipment>")) + else if (lines[i].Contains("<Operator, Epuipment>")) SetOperatorData(segments); - else if (lines[i].Contains(",<Engineer>")) + else if (lines[i].Contains("<Engineer>")) SetEngineerData(segments); - else if (lines[i].Contains(",<NumProbePoints, SingleOrDualProbeConfig, #ActPrbPts, Rsens,IdrvMx,VinGain, DataRejectSigma, MeritThreshold>")) + else if (lines[i].Contains("<NumProbePoints, SingleOrDualProbeConfig, #ActPrbPts, Rsens,IdrvMx,VinGain, DataRejectSigma, MeritThreshold")) SetNumProbePointsData(segments); - else if (lines[i].Contains(",<R,Th,Data, Rs,RsA,RsB, #Smpl, x,y, Irng,Vrng,ChiSq,merit,DataIntegrity>")) + else if (lines[i].Contains("<R,Th,Data, Rs,RsA,RsB, #Smpl, x,y, Irng,Vrng")) { for (int z = i; z < lines.Length; z++) { @@ -250,8 +258,6 @@ public class ProcessData : IProcessData item.Pt = (i + 1).ToString(); item.UniqueId = string.Concat(item, "_Point-", item.Pt); } - // Remove illegal characters \/:*?"<>| found in the Lot. - Lot = Regex.Replace(Lot, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; StringBuilder stringBuilder = new(); string reportFileName = Path.GetFileName(logistics.ReportFullPath); _ = stringBuilder.AppendLine($"RUN [{Title}]"); diff --git a/Adaptation/FileHandlers/pcl/FileRead.cs b/Adaptation/FileHandlers/pcl/FileRead.cs index d8485f0..1c16595 100644 --- a/Adaptation/FileHandlers/pcl/FileRead.cs +++ b/Adaptation/FileHandlers/pcl/FileRead.cs @@ -98,8 +98,8 @@ public class FileRead : Shared.FileRead, IFileRead Tuple<string, Test[], JsonElement[], List<FileInfo>> results = new(string.Empty, null, null, new List<FileInfo>()); _Logistics = new Logistics(this, reportFullPath, useSplitForMID: true); SetFileParameterLotIDToLogisticsMID(); - if (reportFullPath.Length < _MinFileLength) - results.Item4.Add(new FileInfo(reportFullPath)); + if (_Logistics.FileInfo.Length < _MinFileLength) + results.Item4.Add(_Logistics.FileInfo); else { IProcessData iProcessData = new ProcessData(this, _Logistics, results.Item4); @@ -107,9 +107,8 @@ public class FileRead : Shared.FileRead, IFileRead throw new Exception(string.Concat("A) No Data - ", dateTime.Ticks)); string mid = string.Concat(processData.Reactor, "-", processData.RDS, "-", processData.PSN); mid = Regex.Replace(mid, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; - _Logistics.MID = mid; SetFileParameterLotID(mid); - _Logistics.ProcessJobID = processData.Reactor; + _Logistics.Update(mid, processData.Reactor); if (!iProcessData.Details.Any()) throw new Exception(string.Concat("B) No Data - ", dateTime.Ticks)); results = iProcessData.GetResults(this, _Logistics, results.Item4); diff --git a/Adaptation/FileHandlers/pcl/ProcessData.cs b/Adaptation/FileHandlers/pcl/ProcessData.cs index 23a5397..60c556d 100644 --- a/Adaptation/FileHandlers/pcl/ProcessData.cs +++ b/Adaptation/FileHandlers/pcl/ProcessData.cs @@ -278,7 +278,7 @@ public class ProcessData : IProcessData _I = 0; _Data = receivedData; ScanPast("RUN:"); - Run = GetToEOL(); + string title = GetToEOL(); ScanPast("Recipe:"); Recipe = GetBefore("RESISTIVITY SPEC:"); if (string.IsNullOrEmpty(Recipe)) @@ -286,18 +286,44 @@ public class ProcessData : IProcessData _I = 0; _Data = receivedData; ScanPast("RUN:"); - Run = GetToEOL(); + title = GetToEOL(); ScanPast("DEVICE:"); Recipe = GetBefore("RESISTIVITY SPEC:"); } + // Remove illegal characters \/:*?"<>| found in the run. + title = Regex.Replace(title.Trim(), @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; + if (title.StartsWith("1T") || title.StartsWith("1t")) + title = title.Substring(2); + Run = title; + string[] parsedBatch = title.Split('-'); + if (parsedBatch.Length == 1) + RDS = title; + else + { + if (parsedBatch.Length > 0) + Reactor = parsedBatch[0]; + if (parsedBatch.Length > 1) + RDS = parsedBatch[1]; + if (parsedBatch.Length > 2) + { + string[] parsedPSN = parsedBatch[2].Split('.'); + if (parsedPSN.Length >= 1) + PSN = parsedPSN[0]; + if (parsedPSN.Length >= 2) + Layer = parsedPSN[1]; + } + if (parsedBatch.Length > 3) + Zone = parsedBatch[3]; + } ResistivitySpec = GetToEOL(); ScanPast("EQUIP#:"); - EquipId = GetBefore("Engineer:"); + string equipId = GetBefore("Engineer:"); + // Remove illegal characters \/:*?"<>| found in the equipId. + equipId = Regex.Replace(equipId, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; + EquipId = equipId; Engineer = GetToEOL(); ScanPast("LotID:"); Lot = GetBefore("D.L.RATIO:"); - // Remove illegal characters \/:*?"<>| found in the Lot. - Lot = Regex.Replace(Lot, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; DLRatio = GetToEOL(); ScanPast("OPERATOR:"); Employee = GetBefore("TEMP:"); @@ -374,64 +400,18 @@ public class ProcessData : IProcessData } } } - //Id = -1; - Run = Run.Trim(); - if (!Run.StartsWith("[") && !Run.EndsWith("]")) - throw new Exception("Lot summary data is invalid or missing."); - Run = Run.Replace("[", ""); - Run = Run.Replace("]", ""); - Run = Regex.Replace(Run, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; - _Log.Debug($"****ParseData - cde.Run:'{Run}'"); - if (string.IsNullOrEmpty(Run)) - throw new Exception("Batch (Run) information does not exist"); - //parse out batch and validate - string[] parsedBatch = Run.Split('-'); - if (parsedBatch.Length >= 1) - Reactor = parsedBatch[0]; - if (parsedBatch.Length >= 2) - RDS = parsedBatch[1]; - if (parsedBatch.Length >= 3) - { - string[] parsedPSN = parsedBatch[2].Split('.'); - if (parsedPSN.Length >= 1) - PSN = parsedPSN[0]; - if (parsedPSN.Length >= 2) - Layer = parsedPSN[1]; - } - if (parsedBatch.Length >= 4) - Zone = parsedBatch[3]; //create filename / unique id string timeFormat = "yyyyMMddHHmmss"; - //fix equip - StringBuilder equipFixed = new(); - foreach (char c in EquipId) - { - if (char.IsLetterOrDigit(c) || c == '-' || c == '.') - { - _ = equipFixed.Append(c); - } - } - EquipId = equipFixed.ToString(); - _Log.Debug($"****ParseData - cde.EquipId:'{EquipId}'"); - // The "cde.Run" string is used as part of the SharePoint header unique ID. The "cde.Run" ID is typed - // at the tool by the users. The characters are not controlled and the user can type any characters like - // "\", "*", ".", " ", etc. Some of these characters are not valid and thus can't be used for the - // SharePoint header unique ID. Therefore, we need to filter out invalid characters and only keep the - // important ones. - StringBuilder runFixed = new(); - foreach (char c in Run) - { - if (char.IsLetterOrDigit(c) || c == '-' || c == '.') - _ = runFixed.Append(c); - } - Run = runFixed.ToString(); - UniqueId = string.Concat(EquipId, "_", Run, "_", logistics.DateTimeFromSequence.ToString(timeFormat)); + _Log.Debug($"****ParseData - Title:{title}; EquipId:{equipId};"); + if (string.IsNullOrEmpty(title)) + throw new Exception("Batch (title) information does not exist"); + UniqueId = string.Concat(equipId, "_", title, "_", logistics.DateTimeFromSequence.ToString(timeFormat)); foreach (Detail item in _Details.Cast<Detail>()) { item.HeaderUniqueId = UniqueId; item.UniqueId = string.Concat(item, item.UniqueId); } - fileInfoCollection.Add(new FileInfo(logistics.ReportFullPath)); + fileInfoCollection.Add(logistics.FileInfo); } #nullable enable diff --git a/Adaptation/Shared/Logistics.cs b/Adaptation/Shared/Logistics.cs index c441b3f..38ed83c 100644 --- a/Adaptation/Shared/Logistics.cs +++ b/Adaptation/Shared/Logistics.cs @@ -9,34 +9,46 @@ namespace Adaptation.Shared; public class Logistics : ILogistics { - public object NullData { get; private set; } - public string JobID { get; private set; } //CellName - public long Sequence { get; private set; } //Ticks - public DateTime DateTimeFromSequence { get; private set; } - public double TotalSecondsSinceLastWriteTimeFromSequence { get; private set; } - public string MesEntity { get; private set; } //SPC - public string ReportFullPath { get; private set; } //Extract file - public string ProcessJobID { get; set; } //Reactor (duplicate but I want it in the logistics) - public string MID { get; set; } //Lot & Pocket || Lot - public List<string> Tags { get; set; } - public List<string> Logistics1 { get; set; } - public List<Logistics2> Logistics2 { get; set; } + protected readonly DateTime _DateTimeFromSequence; + protected readonly FileInfo _FileInfo; + protected readonly string _JobID; + protected readonly List<string> _Logistics1; + protected readonly List<Logistics2> _Logistics2; + protected string _MID; + protected readonly string _MesEntity; + protected readonly object _NullData; + protected string _ProcessJobID; + protected readonly string _ReportFullPath; + protected readonly long _Sequence; + protected readonly double _TotalSecondsSinceLastWriteTimeFromSequence; + + public DateTime DateTimeFromSequence => _DateTimeFromSequence; + public FileInfo FileInfo => _FileInfo; + public string JobID => _JobID; + public List<string> Logistics1 => _Logistics1; + public List<Logistics2> Logistics2 => _Logistics2; + public string MID => _MID; + public string MesEntity => _MesEntity; + public object NullData => _NullData; + public string ProcessJobID => _ProcessJobID; + public string ReportFullPath => _ReportFullPath; + public long Sequence => _Sequence; + public double TotalSecondsSinceLastWriteTimeFromSequence => _TotalSecondsSinceLastWriteTimeFromSequence; public Logistics(IFileRead fileRead) { DateTime dateTime = DateTime.Now; - NullData = null; - Sequence = dateTime.Ticks; - DateTimeFromSequence = dateTime; - JobID = fileRead.CellInstanceName; - TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; - MesEntity = DefaultMesEntity(dateTime); - ReportFullPath = string.Empty; - ProcessJobID = nameof(ProcessJobID); - MID = nameof(MID); - Tags = new List<string>(); - Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); - Logistics2 = new List<Logistics2>(); + _NullData = null; + _Sequence = dateTime.Ticks; + _DateTimeFromSequence = dateTime; + _JobID = fileRead.CellInstanceName; + _TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; + _MesEntity = DefaultMesEntity(dateTime); + _ReportFullPath = string.Empty; + _ProcessJobID = nameof(ProcessJobID); + _MID = nameof(MID); + _Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); + _Logistics2 = new List<Logistics2>(); } public Logistics(IFileRead fileRead, string reportFullPath, bool useSplitForMID, int? fileInfoLength = null) @@ -45,19 +57,19 @@ public class Logistics : ILogistics throw new Exception(); if (string.IsNullOrEmpty(fileRead.MesEntity)) throw new Exception(); - NullData = fileRead.NullData; - FileInfo fileInfo = new(reportFullPath); - DateTime dateTime = fileInfo.LastWriteTime; - if (fileInfoLength.HasValue && fileInfo.Length < fileInfoLength.Value) + _NullData = fileRead.NullData; + _FileInfo = new(reportFullPath); + DateTime dateTime = _FileInfo.LastWriteTime; + if (fileInfoLength.HasValue && _FileInfo.Length < fileInfoLength.Value) dateTime = dateTime.AddTicks(-1); - JobID = fileRead.CellInstanceName; - Sequence = dateTime.Ticks; - DateTimeFromSequence = dateTime; - TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; - MesEntity = fileRead.MesEntity; - ReportFullPath = fileInfo.FullName; - ProcessJobID = nameof(ProcessJobID); - string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName); + _JobID = fileRead.CellInstanceName; + _Sequence = dateTime.Ticks; + _DateTimeFromSequence = dateTime; + _TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; + _MesEntity = fileRead.MesEntity; + _ReportFullPath = _FileInfo.FullName; + _ProcessJobID = nameof(ProcessJobID); + string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(_FileInfo.FullName); if (useSplitForMID) { if (fileNameWithoutExtension.IndexOf(".") > -1) @@ -67,10 +79,9 @@ public class Logistics : ILogistics if (fileNameWithoutExtension.IndexOf("-") > -1) fileNameWithoutExtension = fileNameWithoutExtension.Split('-')[0].Trim(); } - MID = string.Concat(fileNameWithoutExtension.Substring(0, 1).ToUpper(), fileNameWithoutExtension.Substring(1).ToLower()); - Tags = new List<string>(); - Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); - Logistics2 = new List<Logistics2>(); + _MID = string.Concat(fileNameWithoutExtension.Substring(0, 1).ToUpper(), fileNameWithoutExtension.Substring(1).ToLower()); + _Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); + _Logistics2 = new List<Logistics2>(); } public Logistics(string reportFullPath, string logistics) @@ -78,57 +89,57 @@ public class Logistics : ILogistics string key; DateTime dateTime; string[] segments; - Logistics1 = logistics.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList(); + _FileInfo = new(reportFullPath); + _Logistics1 = logistics.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList(); if (!Logistics1.Any() || !Logistics1[0].StartsWith("LOGISTICS_1")) { - NullData = null; - JobID = "null"; - dateTime = new FileInfo(reportFullPath).LastWriteTime; - Sequence = dateTime.Ticks; - DateTimeFromSequence = dateTime; - TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; - MesEntity = DefaultMesEntity(dateTime); - ReportFullPath = reportFullPath; - ProcessJobID = "R##"; - MID = "null"; - Tags = new List<string>(); - Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); - Logistics2 = new List<Logistics2>(); + _NullData = null; + _JobID = "null"; + dateTime = _FileInfo.LastWriteTime; + _Sequence = dateTime.Ticks; + _DateTimeFromSequence = dateTime; + _TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; + _MesEntity = DefaultMesEntity(dateTime); + _ReportFullPath = reportFullPath; + _ProcessJobID = "R##"; + _MID = "null"; + _Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); + _Logistics2 = new List<Logistics2>(); } else { string logistics1Line1 = Logistics1[0]; key = "NULL_DATA="; if (!logistics1Line1.Contains(key)) - NullData = null; + _NullData = null; else { segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - NullData = segments[1].Split(';')[0]; + _NullData = segments[1].Split(';')[0]; } key = "JOBID="; if (!logistics1Line1.Contains(key)) - JobID = "null"; + _JobID = "null"; else { segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - JobID = segments[1].Split(';')[0]; + _JobID = segments[1].Split(';')[0]; } key = "SEQUENCE="; if (!logistics1Line1.Contains(key)) - dateTime = new FileInfo(reportFullPath).LastWriteTime; + dateTime = _FileInfo.LastWriteTime; else { segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); if (!long.TryParse(segments[1].Split(';')[0].Split('.')[0], out long sequence) || sequence < new DateTime(1999, 1, 1).Ticks) - dateTime = new FileInfo(reportFullPath).LastWriteTime; + dateTime = _FileInfo.LastWriteTime; else dateTime = new DateTime(sequence); } - Sequence = dateTime.Ticks; - DateTimeFromSequence = dateTime; - TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; - DateTime lastWriteTime = new FileInfo(reportFullPath).LastWriteTime; + _Sequence = dateTime.Ticks; + _DateTimeFromSequence = dateTime; + _TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; + DateTime lastWriteTime = _FileInfo.LastWriteTime; if (TotalSecondsSinceLastWriteTimeFromSequence > 600) { if (lastWriteTime != dateTime) @@ -138,33 +149,32 @@ public class Logistics : ILogistics } key = "MES_ENTITY="; if (!logistics1Line1.Contains(key)) - MesEntity = DefaultMesEntity(dateTime); + _MesEntity = DefaultMesEntity(dateTime); else { segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - MesEntity = segments[1].Split(';')[0]; + _MesEntity = segments[1].Split(';')[0]; } - ReportFullPath = reportFullPath; + _ReportFullPath = reportFullPath; key = "PROCESS_JOBID="; if (!logistics1Line1.Contains(key)) - ProcessJobID = "R##"; + _ProcessJobID = "R##"; else { segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - ProcessJobID = segments[1].Split(';')[0]; + _ProcessJobID = segments[1].Split(';')[0]; } key = "MID="; if (!logistics1Line1.Contains(key)) - MID = "null"; + _MID = "null"; else { segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - MID = segments[1].Split(';')[0]; + _MID = segments[1].Split(';')[0]; } } Logistics2 logistics2; - Tags = new List<string>(); - Logistics2 = new List<Logistics2>(); + _Logistics2 = new List<Logistics2>(); for (int i = 1; i < Logistics1.Count; i++) { if (Logistics1[i].StartsWith("LOGISTICS_2")) @@ -180,29 +190,12 @@ public class Logistics : ILogistics } } - public Logistics ShallowCopy() => (Logistics)MemberwiseClone(); - private static string DefaultMesEntity(DateTime dateTime) => string.Concat(dateTime.Ticks, "_MES_ENTITY"); - internal string GetLotViaMostCommonMethod() => MID.Substring(0, MID.Length - 2); - - internal string GetPocketNumberViaMostCommonMethod() => MID.Substring(MID.Length - 2); - - internal void Update(string dateTime, string processJobID, string mid) + internal void Update(string mid, string processJobID) { - if (!DateTime.TryParse(dateTime, out DateTime dateTimeCasted)) - dateTimeCasted = DateTime.Now; - NullData = null; - //JobID = Description.GetCellName(); - Sequence = dateTimeCasted.Ticks; - DateTimeFromSequence = dateTimeCasted; - TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTimeCasted).TotalSeconds; - //MesEntity = DefaultMesEntity(dateTime); - //ReportFullPath = string.Empty; - ProcessJobID = processJobID; - MID = mid; - Tags = new List<string>(); - Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); - Logistics2 = new List<Logistics2>(); + _MID = mid; + _ProcessJobID = processJobID; } + } \ No newline at end of file diff --git a/Adaptation/Shared/ProcessDataStandardFormat.cs b/Adaptation/Shared/ProcessDataStandardFormat.cs index 33a248e..9dcdb0a 100644 --- a/Adaptation/Shared/ProcessDataStandardFormat.cs +++ b/Adaptation/Shared/ProcessDataStandardFormat.cs @@ -12,8 +12,6 @@ namespace Adaptation.Shared; public class ProcessDataStandardFormat { - public const string RecordStart = "RECORD_START"; - public enum SearchFor { EquipmentIntegration = 1, diff --git a/Adaptation/Shared/Properties/ILogistics.cs b/Adaptation/Shared/Properties/ILogistics.cs index dc1a106..398bed9 100644 --- a/Adaptation/Shared/Properties/ILogistics.cs +++ b/Adaptation/Shared/Properties/ILogistics.cs @@ -1,22 +1,23 @@ using System; using System.Collections.Generic; +using System.IO; namespace Adaptation.Shared.Properties; public interface ILogistics { - public object NullData { get; } - public string JobID { get; } //CellName - public long Sequence { get; } //Ticks public DateTime DateTimeFromSequence { get; } + public FileInfo FileInfo { get; } + public string JobID { get; } + public List<string> Logistics1 { get; } + public List<Logistics2> Logistics2 { get; } + public string MID { get; } + public string MesEntity { get; } + public object NullData { get; } + public string ProcessJobID { get; } + public string ReportFullPath { get; } + public long Sequence { get; } public double TotalSecondsSinceLastWriteTimeFromSequence { get; } - public string MesEntity { get; } //SPC - public string ReportFullPath { get; } //Extract file - public string ProcessJobID { get; set; } //Reactor (duplicate but I want it in the logistics) - public string MID { get; set; } //Lot & Pocket || Lot - public List<string> Tags { get; set; } - public List<string> Logistics1 { get; set; } - public List<Logistics2> Logistics2 { get; set; } } \ No newline at end of file diff --git a/Adaptation/_Tests/CreateSelfDescription/Staging/v2.43.3/CDE5-EQPT.cs b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.43.3/CDE5-EQPT.cs new file mode 100644 index 0000000..ac65a80 --- /dev/null +++ b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.43.3/CDE5-EQPT.cs @@ -0,0 +1,60 @@ +using Adaptation._Tests.Shared; +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Diagnostics; +using System.IO; +using System.Reflection; + +namespace Adaptation._Tests.CreateSelfDescription.Staging.v2_43_3; + +[TestClass] +public class CDE5_EQPT : EAFLoggingUnitTesting +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + internal static CDE5_EQPT EAFLoggingUnitTesting { get; private set; } + + public CDE5_EQPT() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false) + { + if (EAFLoggingUnitTesting is null) + throw new Exception(); + } + + public CDE5_EQPT(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) + { + } + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + if (EAFLoggingUnitTesting is null) + EAFLoggingUnitTesting = new CDE5_EQPT(testContext); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(testContext.TestName, " - ClassInitialize")); + string[] fileNameAndText = EAFLoggingUnitTesting.AdaptationTesting.GetCSharpText(testContext.TestName); + File.WriteAllText(fileNameAndText[0], fileNameAndText[1]); + File.WriteAllText(fileNameAndText[2], fileNameAndText[3]); + } + + [ClassCleanup()] + public static void ClassCleanup() + { + if (EAFLoggingUnitTesting.Logger is not null) + EAFLoggingUnitTesting.Logger.LogInformation("Cleanup"); + if (EAFLoggingUnitTesting is not null) + EAFLoggingUnitTesting.Dispose(); + } + + [TestMethod] + public void Staging__v2_43_3__CDE5_EQPT__DownloadRsMFile() + { + string check = "CDE_Logs|WaferMeasurementData.log|.RsM"; + MethodBase methodBase = new StackFrame().GetMethod(); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); + _ = AdaptationTesting.GetWriteConfigurationGetFileRead(methodBase, check, EAFLoggingUnitTesting.AdaptationTesting); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/CreateSelfDescription/Staging/v2.43.3/CDE5.cs b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.43.3/CDE5.cs new file mode 100644 index 0000000..f6de933 --- /dev/null +++ b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.43.3/CDE5.cs @@ -0,0 +1,60 @@ +using Adaptation._Tests.Shared; +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Diagnostics; +using System.IO; +using System.Reflection; + +namespace Adaptation._Tests.CreateSelfDescription.Staging.v2_43_3; + +[TestClass] +public class CDE5 : EAFLoggingUnitTesting +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + internal static CDE5 EAFLoggingUnitTesting { get; private set; } + + public CDE5() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false) + { + if (EAFLoggingUnitTesting is null) + throw new Exception(); + } + + public CDE5(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) + { + } + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + if (EAFLoggingUnitTesting is null) + EAFLoggingUnitTesting = new CDE5(testContext); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(testContext.TestName, " - ClassInitialize")); + string[] fileNameAndText = EAFLoggingUnitTesting.AdaptationTesting.GetCSharpText(testContext.TestName); + File.WriteAllText(fileNameAndText[0], fileNameAndText[1]); + File.WriteAllText(fileNameAndText[2], fileNameAndText[3]); + } + + [ClassCleanup()] + public static void ClassCleanup() + { + if (EAFLoggingUnitTesting.Logger is not null) + EAFLoggingUnitTesting.Logger.LogInformation("Cleanup"); + if (EAFLoggingUnitTesting is not null) + EAFLoggingUnitTesting.Dispose(); + } + + [TestMethod] + public void Staging__v2_43_3__CDE5__RsM() + { + string check = "*.RsM"; + MethodBase methodBase = new StackFrame().GetMethod(); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); + _ = AdaptationTesting.GetWriteConfigurationGetFileRead(methodBase, check, EAFLoggingUnitTesting.AdaptationTesting); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Extract/Staging/v2.43.3/CDE5-EQPT.cs b/Adaptation/_Tests/Extract/Staging/v2.43.3/CDE5-EQPT.cs new file mode 100644 index 0000000..ba70cfa --- /dev/null +++ b/Adaptation/_Tests/Extract/Staging/v2.43.3/CDE5-EQPT.cs @@ -0,0 +1,41 @@ +using Adaptation.Shared; +using Adaptation.Shared.Methods; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Diagnostics; +using System.Reflection; +using System.Threading; + +namespace Adaptation._Tests.Extract.Staging.v2_43_3; + +[TestClass] +public class CDE5_EQPT +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + private static CreateSelfDescription.Staging.v2_43_3.CDE5_EQPT _CDE5_EQPT; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + CreateSelfDescription.Staging.v2_43_3.CDE5_EQPT.ClassInitialize(testContext); + _CDE5_EQPT = CreateSelfDescription.Staging.v2_43_3.CDE5_EQPT.EAFLoggingUnitTesting; + } + + [TestMethod] + public void Staging__v2_43_3__CDE5_EQPT__DownloadRsMFile() => _CDE5_EQPT.Staging__v2_43_3__CDE5_EQPT__DownloadRsMFile(); + + + [TestMethod] + public void Staging__v2_43_3__CDE5_EQPT__DownloadRsMFile6420637710931421087642__Normal() + { + string check = "CDE_Logs|WaferMeasurementData.log|.RsM"; + MethodBase methodBase = new StackFrame().GetMethod(); + _CDE5_EQPT.Staging__v2_43_3__CDE5_EQPT__DownloadRsMFile(); + _ = _CDE5_EQPT.AdaptationTesting.GetVariables(methodBase, check); + for (int i = 0; i < int.MinValue; i++) + Thread.Sleep(500); + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Extract/Staging/v2.43.3/CDE5.cs b/Adaptation/_Tests/Extract/Staging/v2.43.3/CDE5.cs new file mode 100644 index 0000000..ce45561 --- /dev/null +++ b/Adaptation/_Tests/Extract/Staging/v2.43.3/CDE5.cs @@ -0,0 +1,72 @@ +using Adaptation.Shared; +using Adaptation.Shared.Methods; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Diagnostics; +using System.IO; +using System.Reflection; + +namespace Adaptation._Tests.Extract.Staging.v2_43_3; + +[TestClass] +public class CDE5 +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + private static CreateSelfDescription.Staging.v2_43_3.CDE5 _CDE5; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + CreateSelfDescription.Staging.v2_43_3.CDE5.ClassInitialize(testContext); + _CDE5 = CreateSelfDescription.Staging.v2_43_3.CDE5.EAFLoggingUnitTesting; + } + + [TestMethod] + public void Staging__v2_43_3__CDE5__RsM() => _CDE5.Staging__v2_43_3__CDE5__RsM(); + + [TestMethod] + public void Staging__v2_43_3__CDE5__RsM637919422210000000__Normal() + { + DateTime dateTime; + string check = "*.RsM"; + _CDE5.Staging__v2_43_3__CDE5__RsM(); + MethodBase methodBase = new StackFrame().GetMethod(); + string[] variables = _CDE5.AdaptationTesting.GetVariables(methodBase, check); + IFileRead fileRead = _CDE5.AdaptationTesting.Get(methodBase, sourceFileLocation: variables[2], sourceFileFilter: variables[3], useCyclicalForDescription: false); + Logistics logistics = new(fileRead); + string extractResultItem1 = Shared.AdaptationTesting.ReExtractCompareUpdatePassDirectory(variables, fileRead, logistics, validatePDSF: false); + dateTime = FileHandlers.RsM.ProcessData.GetDateTime(logistics, string.Empty); + Assert.IsTrue(dateTime == logistics.DateTimeFromSequence); + dateTime = FileHandlers.RsM.ProcessData.GetDateTime(logistics, "00:13 09/27/38"); + Assert.IsTrue(dateTime == logistics.DateTimeFromSequence); + string logBody = @" +RUN [59-478796-3978.1] +Recipe LSL_6in \ WACKER2 RESISTIVITY #### +EQUIP# CDE5 Engineer Engineer +LotID LotID D.L.RATIO #.#### +OPERATOR Operator TEMP 19.4 00:13 09/27/38 +AutoOptimizeGain = ### AutoProbeHeightSet = ## +DataReject > #.#Sigma +0 ..\LSL_6in.prj\WACKER2.rcp\8927A117.RsM 00:13 09/27/38 +pt# R Th Rs[Ohm/sq@T] Merit +1 65.0 -44.5 577.7672 77.80 +2 32.5 -44.5 572.4527 103.00 +3 0.0 0.5 581.8071 108.00 +4 -32.5 -44.5 576.9838 93.00 +5 -65.0 -44.5 577.0866 69.80 +Avg = 577.219 0.58% SEMI Radial= #.##% + "; + bool logBodyCheck = logBody.Trim() == extractResultItem1.Trim(); + if (!logBodyCheck) + { + _ = Process.Start("explorer.exe", variables[5]); + File.WriteAllText(Path.Combine(variables[5], "0.log"), logBody.Trim()); + File.WriteAllText(Path.Combine(variables[5], "1.log"), extractResultItem1.Trim()); + } + Assert.IsTrue(logBodyCheck, "Log Body doesn't match!"); + } + +} \ No newline at end of file diff --git a/Adaptation/package.json b/Adaptation/package.json index 3427440..2fb8a71 100644 --- a/Adaptation/package.json +++ b/Adaptation/package.json @@ -23,6 +23,8 @@ "BW-Extract.Staging.v2_43_2-CDE2": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_43_2 & ClassName~CDE2\" -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", "BX-Extract.Staging.v2_43_2-CDE3_EQPT": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_43_2 & ClassName~CDE3_EQPT\" -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", "BY-Extract.Staging.v2_43_2-CDE3": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_43_2 & ClassName~CDE3\" -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", - "BZ-Extract.Staging.v2_43_2": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_43_2\" -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")" + "BZ-Extract.Staging.v2_43_2": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_43_2\" -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "CA-Extract.Staging.v2_43_3-CDE5-Staging__v2_43_3__CDE5_EQPT__DownloadRsMFile6420637710931421087642__Normal": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_43_3 & ClassName~CDE5 & Name~Staging__v2_43_3__CDE5_EQPT__DownloadRsMFile6420637710931421087642__Normal\" -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "CB-Extract.Staging.v2_43_3-CDE5-Staging__v2_43_3__CDE5__RsM637919422210000000__Normal": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_43_3 & ClassName~CDE5 & Name~Staging__v2_43_3__CDE5__RsM637919422210000000__Normal\" -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")" } } \ No newline at end of file