This is an automated email from the ASF dual-hosted git repository.

hansva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/main by this push:
     new 8f84817ac5 Get filenames was only listing files, fixes #5848 (#5876)
8f84817ac5 is described below

commit 8f84817ac5b263d871a2d95241b176cb2a388af5
Author: Hans Van Akelyen <[email protected]>
AuthorDate: Thu Oct 23 16:52:10 2025 +0200

    Get filenames was only listing files, fixes #5848 (#5876)
---
 assemblies/debug/pom.xml                           |   6 +
 .../pipeline/transforms/getfilenames/FileItem.java |  44 +---
 .../transforms/getfilenames/FilterItem.java        |  12 +-
 .../transforms/getfilenames/GetFileNames.java      |  12 +-
 .../transforms/getfilenames/GetFileNamesData.java  |   4 +-
 .../getfilenames/GetFileNamesDialog.java           |  61 ++---
 .../transforms/getfilenames/GetFileNamesMeta.java  | 165 +-------------
 .../transforms/getfilenames/FileItemTest.java      | 167 ++++++++++++++
 .../transforms/getfilenames/FilterItemTest.java    | 128 +++++++++++
 .../getfilenames/GetFileNamesDataTest.java         | 175 +++++++++++++++
 .../getfilenames/GetFileNamesEdgeCasesTest.java    | 245 +++++++++++++++++++++
 .../GetFileNamesMetaAdditionalTest.java            | 229 +++++++++++++++++++
 .../getfilenames/GetFileNamesMetaTest.java         |  20 +-
 .../getfilenames/GetFileNamesTransformTest.java    | 239 ++++++++++++++++++++
 14 files changed, 1235 insertions(+), 272 deletions(-)

diff --git a/assemblies/debug/pom.xml b/assemblies/debug/pom.xml
index 8f63d95224..6124165d55 100644
--- a/assemblies/debug/pom.xml
+++ b/assemblies/debug/pom.xml
@@ -445,6 +445,12 @@
             <version>${project.version}</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.hop</groupId>
+            <artifactId>hop-transform-getfilenames</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>org.apache.hop</groupId>
             <artifactId>hop-transform-getvariable</artifactId>
diff --git 
a/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/FileItem.java
 
b/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/FileItem.java
index 6dd56f59d4..bbc8606b2e 100644
--- 
a/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/FileItem.java
+++ 
b/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/FileItem.java
@@ -18,9 +18,13 @@
 package org.apache.hop.pipeline.transforms.getfilenames;
 
 import java.util.Objects;
+import lombok.Getter;
+import lombok.Setter;
 import org.apache.hop.core.util.Utils;
 import org.apache.hop.metadata.api.HopMetadataProperty;
 
+@Getter
+@Setter
 public class FileItem {
 
   private static final String NO = "N";
@@ -77,46 +81,6 @@ public class FileItem {
     this.includeSubFolders = NO;
   }
 
-  public String getFileName() {
-    return fileName;
-  }
-
-  public void setFileName(String fileName) {
-    this.fileName = fileName;
-  }
-
-  public String getFileMask() {
-    return fileMask;
-  }
-
-  public void setFileMask(String fileMask) {
-    this.fileMask = fileMask;
-  }
-
-  public String getExcludeFileMask() {
-    return excludeFileMask;
-  }
-
-  public void setExcludeFileMask(String excludeFileMask) {
-    this.excludeFileMask = excludeFileMask;
-  }
-
-  public String getFileRequired() {
-    return fileRequired;
-  }
-
-  public void setFileRequired(String fileRequired) {
-    this.fileRequired = fileRequired;
-  }
-
-  public String getIncludeSubFolders() {
-    return includeSubFolders;
-  }
-
-  public void setIncludeSubFolders(String includeSubFolders) {
-    this.includeSubFolders = includeSubFolders;
-  }
-
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;
diff --git 
a/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/FilterItem.java
 
b/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/FilterItem.java
index 1685b9890d..0f7d2ecdf4 100644
--- 
a/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/FilterItem.java
+++ 
b/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/FilterItem.java
@@ -18,8 +18,12 @@
 package org.apache.hop.pipeline.transforms.getfilenames;
 
 import java.util.Objects;
+import lombok.Getter;
+import lombok.Setter;
 import org.apache.hop.metadata.api.HopMetadataProperty;
 
+@Getter
+@Setter
 public class FilterItem {
 
   /** The file filter type selection */
@@ -34,14 +38,6 @@ public class FilterItem {
     this.fileTypeFilterSelection = fileTypeFilterSelection;
   }
 
-  public String getFileTypeFilterSelection() {
-    return fileTypeFilterSelection;
-  }
-
-  public void setFileTypeFilterSelection(String fileTypeFilterSelection) {
-    this.fileTypeFilterSelection = fileTypeFilterSelection;
-  }
-
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;
diff --git 
a/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNames.java
 
b/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNames.java
index 25f56e539b..41a994989c 100644
--- 
a/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNames.java
+++ 
b/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNames.java
@@ -227,16 +227,16 @@ public class GetFileNames extends 
BaseTransform<GetFileNamesMeta, GetFileNamesDa
           extraData[outputIndex++] = data.file.getType().toString();
 
           // exists
-          extraData[outputIndex++] = Boolean.valueOf(data.file.exists());
+          extraData[outputIndex++] = data.file.exists();
 
           // ishidden
-          extraData[outputIndex++] = Boolean.valueOf(data.file.isHidden());
+          extraData[outputIndex++] = data.file.isHidden();
 
           // isreadable
-          extraData[outputIndex++] = Boolean.valueOf(data.file.isReadable());
+          extraData[outputIndex++] = data.file.isReadable();
 
           // iswriteable
-          extraData[outputIndex++] = Boolean.valueOf(data.file.isWriteable());
+          extraData[outputIndex++] = data.file.isWriteable();
 
           // lastmodifiedtime
           extraData[outputIndex++] = new 
Date(data.file.getContent().getLastModifiedTime());
@@ -244,7 +244,7 @@ public class GetFileNames extends 
BaseTransform<GetFileNamesMeta, GetFileNamesDa
           // size
           Long size = null;
           if (data.file.getType().equals(FileType.FILE)) {
-            size = Long.valueOf(data.file.getContent().getSize());
+            size = data.file.getContent().getSize();
           }
 
           extraData[outputIndex++] = size;
@@ -264,7 +264,7 @@ public class GetFileNames extends 
BaseTransform<GetFileNamesMeta, GetFileNamesDa
 
         // See if we need to add the row number to the row...
         if (meta.isIncludeRowNumber() && 
!Utils.isEmpty(meta.getRowNumberField())) {
-          extraData[outputIndex++] = Long.valueOf(data.rownr + 1);
+          extraData[outputIndex++] = data.rownr + 1;
         }
 
         data.rownr++;
diff --git 
a/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesData.java
 
b/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesData.java
index 3f221c4e42..31ebda3e27 100644
--- 
a/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesData.java
+++ 
b/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesData.java
@@ -41,7 +41,7 @@ public class GetFileNamesData extends BaseTransformData 
implements ITransformDat
 
   public Object[] previousRow;
 
-  public int nr_repeats;
+  public int nrRepeats;
 
   public int nrLinesOnPage;
 
@@ -114,7 +114,7 @@ public class GetFileNamesData extends BaseTransformData 
implements ITransformDat
     daf = new SimpleDateFormat();
     dafs = new DateFormatSymbols();
 
-    nr_repeats = 0;
+    nrRepeats = 0;
     previousRow = null;
     filenr = 0;
     filessize = 0;
diff --git 
a/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesDialog.java
 
b/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesDialog.java
index 8d13e0900e..6695595543 100644
--- 
a/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesDialog.java
+++ 
b/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesDialog.java
@@ -76,64 +76,25 @@ public class GetFileNamesDialog extends BaseTransformDialog 
{
   private Label wlRaiseAnExceptionIfNoFile;
   private Button wRaiseAnExceptionIfNoFile;
 
-  private Label wlFilename;
-
-  private Button wbbFilename; // Browse: add file or directory
-
-  private Button wbdFilename; // Delete
-
-  private Button wbeFilename; // Edit
-
-  private Button wbaFilename; // Add or change
-
   private TextVar wFilename;
-
-  private Label wlFilenameList;
-
   private TableView wFilenameList;
-
-  private Label wlExcludeFilemask;
-
   private TextVar wExcludeFilemask;
-
-  private Label wlFilemask;
-
   private TextVar wFilemask;
-
-  private Button wbShowFiles;
-
   private CCombo wFilterFileType;
-
   private final GetFileNamesMeta input;
-
   private Button wFileField;
-  private Label wFileFieldWarning;
-
-  private Label wlFilenameField;
   private CCombo wFilenameField;
-
-  private Label wlWildcardField;
   private CCombo wWildcardField;
-
-  private Label wlExcludeWildcardField;
   private CCombo wExcludeWildcardField;
-
-  private Label wlIncludeSubFolder;
   private Button wIncludeSubFolder;
-
   private Button wAddResult;
-
   private Text wLimit;
-
   private Button wInclRownum;
-
   private TextVar wInclRownumField;
-
   private boolean getPreviousFields = false;
-
   private Group groupAsDefined;
-
   private Group groupFromField;
+  private Label wFileFieldWarning;
 
   public GetFileNamesDialog(
       Shell parent,
@@ -228,7 +189,7 @@ public class GetFileNamesDialog extends BaseTransformDialog 
{
     WidgetUtils.setFormLayout(group, 10);
 
     // Filename field
-    wlFilenameField = new Label(group, SWT.RIGHT);
+    Label wlFilenameField = new Label(group, SWT.RIGHT);
     wlFilenameField.setText(BaseMessages.getString(PKG, 
"GetFileNamesDialog.FilenameField.Label"));
     PropsUi.setLook(wlFilenameField);
     wlFilenameField.setLayoutData(
@@ -250,7 +211,7 @@ public class GetFileNamesDialog extends BaseTransformDialog 
{
             .result());
 
     // Wildcard field
-    wlWildcardField = new Label(group, SWT.RIGHT);
+    Label wlWildcardField = new Label(group, SWT.RIGHT);
     wlWildcardField.setText(BaseMessages.getString(PKG, 
"GetFileNamesDialog.WildcardField.Label"));
     PropsUi.setLook(wlWildcardField);
     wlWildcardField.setLayoutData(
@@ -272,7 +233,7 @@ public class GetFileNamesDialog extends BaseTransformDialog 
{
             .result());
 
     // ExcludeWildcard field
-    wlExcludeWildcardField = new Label(group, SWT.RIGHT);
+    Label wlExcludeWildcardField = new Label(group, SWT.RIGHT);
     wlExcludeWildcardField.setText(
         BaseMessages.getString(PKG, 
"GetFileNamesDialog.ExcludeWildcardField.Label"));
     PropsUi.setLook(wlExcludeWildcardField);
@@ -295,7 +256,7 @@ public class GetFileNamesDialog extends BaseTransformDialog 
{
             .result());
 
     // Is includeSubFoldername defined in a Field
-    wlIncludeSubFolder = new Label(group, SWT.RIGHT);
+    Label wlIncludeSubFolder = new Label(group, SWT.RIGHT);
     wlIncludeSubFolder.setText(
         BaseMessages.getString(PKG, 
"GetFileNamesDialog.IncludeSubFolder.Label"));
     PropsUi.setLook(wlIncludeSubFolder);
@@ -329,6 +290,15 @@ public class GetFileNamesDialog extends 
BaseTransformDialog {
 
   private Group createGroupAsDefined(
       Composite parent, int margin, int middle, ModifyListener lsMod) {
+    Button wbShowFiles;
+    Label wlFilemask;
+    Label wlExcludeFilemask;
+    Label wlFilenameList;
+    Button wbaFilename;
+    Button wbeFilename;
+    Button wbdFilename;
+    Button wbbFilename;
+    Label wlFilename;
     Group group = new Group(parent, SWT.SHADOW_NONE);
     PropsUi.setLook(group);
     group.setText(BaseMessages.getString(PKG, 
"GetFileNamesDialog.Group.ByDefinition.Label"));
@@ -655,7 +625,8 @@ public class GetFileNamesDialog extends BaseTransformDialog 
{
         new FormDataBuilder().left(0, margin).top(0, 3 * margin).right(middle, 
-margin).result());
 
     wFilterFileType = new CCombo(wFilterComp, SWT.SINGLE | SWT.READ_ONLY | 
SWT.BORDER);
-    BaseMessages.getString(PKG, 
"GetFileNamesDialog.FilterTab.FileType.All.Label");
+    wFilterFileType.add(
+        BaseMessages.getString(PKG, 
"GetFileNamesDialog.FilterTab.FileType.All.Label"));
     wFilterFileType.add(
         BaseMessages.getString(PKG, 
"GetFileNamesDialog.FilterTab.FileType.OnlyFile.Label"));
     wFilterFileType.add(
diff --git 
a/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesMeta.java
 
b/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesMeta.java
index daffd46c04..a579046621 100644
--- 
a/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesMeta.java
+++ 
b/plugins/transforms/getfilenames/src/main/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesMeta.java
@@ -20,6 +20,8 @@ package org.apache.hop.pipeline.transforms.getfilenames;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import lombok.Getter;
+import lombok.Setter;
 import org.apache.commons.vfs2.FileObject;
 import org.apache.hop.core.CheckResult;
 import org.apache.hop.core.ICheckResult;
@@ -56,6 +58,8 @@ import org.apache.hop.resource.ResourceReference;
     categoryDescription = 
"i18n:org.apache.hop.pipeline.transform:BaseTransform.Category.Input",
     keywords = "i18n::GetFileNamesMeta.keyword",
     documentationUrl = "/pipeline/transforms/getfilenames.html")
+@Getter
+@Setter
 public class GetFileNamesMeta extends BaseTransformMeta<GetFileNames, 
GetFileNamesData> {
   private static final Class<?> PKG = GetFileNamesMeta.class;
 
@@ -154,153 +158,6 @@ public class GetFileNamesMeta extends 
BaseTransformMeta<GetFileNames, GetFileNam
     filterItemList = new ArrayList<>();
   }
 
-  public List<FileItem> getFilesList() {
-    return filesList;
-  }
-
-  public void setFilesList(List<FileItem> filesList) {
-    this.filesList = filesList;
-  }
-
-  public List<FilterItem> getFilterItemList() {
-    return filterItemList;
-  }
-
-  public void setFilterItemList(List<FilterItem> filterItemList) {
-    this.filterItemList = filterItemList;
-  }
-
-  /**
-   * @return the doNotFailIfNoFile flag
-   */
-  public boolean isDoNotFailIfNoFile() {
-    return doNotFailIfNoFile;
-  }
-
-  /**
-   * @param doNotFailIfNoFile the doNotFailIfNoFile to set
-   */
-  public void setDoNotFailIfNoFile(boolean doNotFailIfNoFile) {
-    this.doNotFailIfNoFile = doNotFailIfNoFile;
-  }
-
-  /**
-   * @return the raiseAnExceptionIfNoFile flag
-   */
-  public boolean isRaiseAnExceptionIfNoFile() {
-    return raiseAnExceptionIfNoFile;
-  }
-
-  /**
-   * @param raiseAnExceptionIfNoFile the raiseAnExceptionIfNoFile to set
-   */
-  public void setRaiseAnExceptionIfNoFile(boolean raiseAnExceptionIfNoFile) {
-    this.raiseAnExceptionIfNoFile = raiseAnExceptionIfNoFile;
-  }
-
-  /**
-   * @return Returns the rowNumberField.
-   */
-  public String getRowNumberField() {
-    return rowNumberField;
-  }
-
-  /**
-   * @param dynamicFilenameField The dynamic filename field to set.
-   */
-  public void setDynamicFilenameField(String dynamicFilenameField) {
-    this.dynamicFilenameField = dynamicFilenameField;
-  }
-
-  /**
-   * @param dynamicWildcardField The dynamic wildcard field to set.
-   */
-  public void setDynamicWildcardField(String dynamicWildcardField) {
-    this.dynamicWildcardField = dynamicWildcardField;
-  }
-
-  /**
-   * @param rowNumberField The rowNumberField to set.
-   */
-  public void setRowNumberField(String rowNumberField) {
-    this.rowNumberField = rowNumberField;
-  }
-
-  /**
-   * @return Returns the dynamic filename field (from previous transforms)
-   */
-  public String getDynamicFilenameField() {
-    return dynamicFilenameField;
-  }
-
-  /**
-   * @return Returns the dynamic wildcard field (from previous transforms)
-   */
-  public String getDynamicWildcardField() {
-    return dynamicWildcardField;
-  }
-
-  public String getDynamicExcludeWildcardField() {
-    return this.dynamicExcludeWildcardField;
-  }
-
-  /**
-   * @param dynamicExcludeWildcardField The dynamic excludeWildcard field to 
set.
-   */
-  public void setDynamicExcludeWildcardField(String 
dynamicExcludeWildcardField) {
-    this.dynamicExcludeWildcardField = dynamicExcludeWildcardField;
-  }
-
-  /**
-   * @return Returns the includeRowNumber.
-   */
-  public boolean isIncludeRowNumber() {
-    return includeRowNumber;
-  }
-
-  /**
-   * @return Returns the File field.
-   */
-  public boolean isFileField() {
-    return fileField;
-  }
-
-  /**
-   * @param fileField The filefield to set.
-   */
-  public void setFileField(boolean fileField) {
-    this.fileField = fileField;
-  }
-
-  public boolean isDynamicIncludeSubFolders() {
-    return dynamicIncludeSubFolders;
-  }
-
-  public void setDynamicIncludeSubFolders(boolean dynamicIncludeSubFolders) {
-    this.dynamicIncludeSubFolders = dynamicIncludeSubFolders;
-  }
-
-  /**
-   * @param includeRowNumber The includeRowNumber to set.
-   */
-  public void setIncludeRowNumber(boolean includeRowNumber) {
-    this.includeRowNumber = includeRowNumber;
-  }
-
-  /**
-   * @param addResultFile The isaddresult to set.
-   */
-  public void setAddResultFile(boolean addResultFile) {
-    this.addResultFile = addResultFile;
-  }
-
-  /**
-   * @return Returns isaddresult.
-   */
-  public boolean isAddResultFile() {
-    return addResultFile;
-  }
-
   public String getRequiredFilesDesc(String tt) {
     if (tt == null) {
       return RequiredFilesDesc[0];
@@ -312,20 +169,6 @@ public class GetFileNamesMeta extends 
BaseTransformMeta<GetFileNames, GetFileNam
     }
   }
 
-  /**
-   * @return Returns the rowLimit.
-   */
-  public long getRowLimit() {
-    return rowLimit;
-  }
-
-  /**
-   * @param rowLimit The rowLimit to set.
-   */
-  public void setRowLimit(long rowLimit) {
-    this.rowLimit = rowLimit;
-  }
-
   @Override
   public Object clone() {
     return (GetFileNamesMeta) super.clone();
diff --git 
a/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/FileItemTest.java
 
b/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/FileItemTest.java
new file mode 100644
index 0000000000..0b7a35898f
--- /dev/null
+++ 
b/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/FileItemTest.java
@@ -0,0 +1,167 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hop.pipeline.transforms.getfilenames;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.Test;
+
+/** Test class for FileItem */
+class FileItemTest {
+
+  @Test
+  void testDefaultConstructor() {
+    FileItem fileItem = new FileItem();
+
+    assertNotNull(fileItem);
+    assertNull(fileItem.getFileName());
+    assertNull(fileItem.getFileMask());
+    assertNull(fileItem.getExcludeFileMask());
+    assertEquals("N", fileItem.getFileRequired());
+    assertEquals("N", fileItem.getIncludeSubFolders());
+  }
+
+  @Test
+  void stParameterizedConstructor() {
+    String fileName = "test.txt";
+    String fileMask = "*.txt";
+    String excludeFileMask = "*.tmp";
+    String fileRequired = "Y";
+    String includeSubFolders = "Y";
+
+    FileItem fileItem =
+        new FileItem(fileName, fileMask, excludeFileMask, fileRequired, 
includeSubFolders);
+
+    assertEquals(fileName, fileItem.getFileName());
+    assertEquals(fileMask, fileItem.getFileMask());
+    assertEquals(excludeFileMask, fileItem.getExcludeFileMask());
+    assertEquals(fileRequired, fileItem.getFileRequired());
+    assertEquals(includeSubFolders, fileItem.getIncludeSubFolders());
+  }
+
+  @Test
+  void testParameterizedConstructorWithEmptyValues() {
+    String fileName = "test.txt";
+    String fileMask = "*.txt";
+    String excludeFileMask = "*.tmp";
+
+    FileItem fileItem = new FileItem(fileName, fileMask, excludeFileMask, "", 
"");
+
+    assertEquals(fileName, fileItem.getFileName());
+    assertEquals(fileMask, fileItem.getFileMask());
+    assertEquals(excludeFileMask, fileItem.getExcludeFileMask());
+    assertEquals("N", fileItem.getFileRequired());
+    assertEquals("N", fileItem.getIncludeSubFolders());
+  }
+
+  @Test
+  void testParameterizedConstructorWithNullValues() {
+    String fileName = "test.txt";
+    String fileMask = "*.txt";
+    String excludeFileMask = "*.tmp";
+
+    FileItem fileItem = new FileItem(fileName, fileMask, excludeFileMask, 
null, null);
+
+    assertEquals(fileName, fileItem.getFileName());
+    assertEquals(fileMask, fileItem.getFileMask());
+    assertEquals(excludeFileMask, fileItem.getExcludeFileMask());
+    assertEquals("N", fileItem.getFileRequired());
+    assertEquals("N", fileItem.getIncludeSubFolders());
+  }
+
+  @Test
+  void testSettersAndGetters() {
+    FileItem fileItem = new FileItem();
+
+    fileItem.setFileName("newfile.txt");
+    fileItem.setFileMask("*.txt");
+    fileItem.setExcludeFileMask("*.tmp");
+    fileItem.setFileRequired("Y");
+    fileItem.setIncludeSubFolders("Y");
+
+    assertEquals("newfile.txt", fileItem.getFileName());
+    assertEquals("*.txt", fileItem.getFileMask());
+    assertEquals("*.tmp", fileItem.getExcludeFileMask());
+    assertEquals("Y", fileItem.getFileRequired());
+    assertEquals("Y", fileItem.getIncludeSubFolders());
+  }
+
+  @Test
+  void testEquals() {
+    FileItem fileItem1 = new FileItem("test.txt", "*.txt", "*.tmp", "Y", "N");
+    FileItem fileItem2 = new FileItem("test.txt", "*.txt", "*.tmp", "Y", "N");
+    FileItem fileItem3 = new FileItem("test.txt", "*.txt", "*.tmp", "N", "Y");
+    FileItem fileItem4 = new FileItem("other.txt", "*.txt", "*.tmp", "Y", "N");
+
+    assertEquals(fileItem1, fileItem2);
+    assertEquals(fileItem1, fileItem3); // equals only considers fileName, 
fileMask, excludeFileMask
+    assertNotEquals(fileItem1, fileItem4);
+    assertNotEquals(null, fileItem1);
+    assertNotEquals("not a FileItem", fileItem1);
+  }
+
+  @Test
+  void testEqualsWithNullValues() {
+    FileItem fileItem1 = new FileItem("test.txt", null, null, "Y", "N");
+    FileItem fileItem2 = new FileItem("test.txt", null, null, "Y", "N");
+    FileItem fileItem3 = new FileItem("test.txt", "*.txt", null, "Y", "N");
+
+    assertEquals(fileItem1, fileItem2);
+    assertNotEquals(fileItem1, fileItem3);
+  }
+
+  @Test
+  void testHashCode() {
+    FileItem fileItem1 = new FileItem("test.txt", "*.txt", "*.tmp", "Y", "N");
+    FileItem fileItem2 = new FileItem("test.txt", "*.txt", "*.tmp", "Y", "N");
+    FileItem fileItem3 = new FileItem("test.txt", "*.txt", "*.tmp", "N", "Y");
+    FileItem fileItem4 = new FileItem("other.txt", "*.txt", "*.tmp", "Y", "N");
+
+    assertEquals(fileItem1.hashCode(), fileItem2.hashCode());
+    assertEquals(
+        fileItem1.hashCode(),
+        fileItem3.hashCode()); // hashCode only considers fileName, fileMask, 
excludeFileMask
+    assertNotEquals(fileItem1.hashCode(), fileItem4.hashCode());
+  }
+
+  @Test
+  void testHashCodeWithNullValues() {
+    FileItem fileItem1 = new FileItem("test.txt", null, null, "Y", "N");
+    FileItem fileItem2 = new FileItem("test.txt", null, null, "Y", "N");
+
+    assertEquals(fileItem1.hashCode(), fileItem2.hashCode());
+  }
+
+  @Test
+  void testSelfEquality() {
+    FileItem fileItem = new FileItem("test.txt", "*.txt", "*.tmp", "Y", "N");
+    assertEquals(fileItem, fileItem);
+  }
+
+  @Test
+  void testToString() {
+    FileItem fileItem = new FileItem("test.txt", "*.txt", "*.tmp", "Y", "N");
+    String result = fileItem.toString();
+    assertNotNull(result);
+    assertTrue(result.contains("FileItem"));
+  }
+}
diff --git 
a/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/FilterItemTest.java
 
b/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/FilterItemTest.java
new file mode 100644
index 0000000000..865c3f3eea
--- /dev/null
+++ 
b/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/FilterItemTest.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hop.pipeline.transforms.getfilenames;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.Test;
+
+/** Test class for FilterItem */
+class FilterItemTest {
+
+  @Test
+  void testDefaultConstructor() {
+    FilterItem filterItem = new FilterItem();
+
+    assertNotNull(filterItem);
+    assertNull(filterItem.getFileTypeFilterSelection());
+  }
+
+  @Test
+  void testParameterizedConstructor() {
+    String fileTypeFilterSelection = "FILES_ONLY";
+
+    FilterItem filterItem = new FilterItem(fileTypeFilterSelection);
+
+    assertEquals(fileTypeFilterSelection, 
filterItem.getFileTypeFilterSelection());
+  }
+
+  @Test
+  void testParameterizedConstructorWithNull() {
+    FilterItem filterItem = new FilterItem(null);
+
+    assertNull(filterItem.getFileTypeFilterSelection());
+  }
+
+  @Test
+  void testSettersAndGetters() {
+    FilterItem filterItem = new FilterItem();
+
+    filterItem.setFileTypeFilterSelection("FILES_AND_FOLDERS");
+
+    assertEquals("FILES_AND_FOLDERS", filterItem.getFileTypeFilterSelection());
+  }
+
+  @Test
+  void testEquals() {
+    FilterItem filterItem1 = new FilterItem("FILES_ONLY");
+    FilterItem filterItem2 = new FilterItem("FILES_ONLY");
+    FilterItem filterItem3 = new FilterItem("FILES_AND_FOLDERS");
+    FilterItem filterItem4 = new FilterItem(null);
+
+    assertEquals(filterItem1, filterItem2);
+    assertNotEquals(filterItem1, filterItem3);
+    assertNotEquals(filterItem1, filterItem4);
+    assertNotEquals(null, filterItem1);
+    assertNotEquals("not a FilterItem", filterItem1);
+  }
+
+  @Test
+  void testEqualsWithNullValues() {
+    FilterItem filterItem1 = new FilterItem(null);
+    FilterItem filterItem2 = new FilterItem(null);
+    FilterItem filterItem3 = new FilterItem("FILES_ONLY");
+
+    assertEquals(filterItem1, filterItem2);
+    assertNotEquals(filterItem1, filterItem3);
+  }
+
+  @Test
+  void testHashCode() {
+    FilterItem filterItem1 = new FilterItem("FILES_ONLY");
+    FilterItem filterItem2 = new FilterItem("FILES_ONLY");
+    FilterItem filterItem3 = new FilterItem("FILES_AND_FOLDERS");
+
+    assertEquals(filterItem1.hashCode(), filterItem2.hashCode());
+    assertNotEquals(filterItem1.hashCode(), filterItem3.hashCode());
+  }
+
+  @Test
+  void testHashCodeWithNullValues() {
+    FilterItem filterItem1 = new FilterItem(null);
+    FilterItem filterItem2 = new FilterItem(null);
+
+    assertEquals(filterItem1.hashCode(), filterItem2.hashCode());
+  }
+
+  @Test
+  void testSelfEquality() {
+    FilterItem filterItem = new FilterItem("FILES_ONLY");
+    assertEquals(filterItem, filterItem);
+  }
+
+  @Test
+  void testToString() {
+    FilterItem filterItem = new FilterItem("FILES_ONLY");
+    String result = filterItem.toString();
+    assertNotNull(result);
+    assertTrue(result.contains("FilterItem"));
+  }
+
+  @Test
+  void testEmptyString() {
+    FilterItem filterItem = new FilterItem("");
+
+    assertEquals("", filterItem.getFileTypeFilterSelection());
+    assertEquals(new FilterItem(""), filterItem);
+    assertEquals(filterItem.hashCode(), new FilterItem("").hashCode());
+  }
+}
diff --git 
a/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesDataTest.java
 
b/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesDataTest.java
new file mode 100644
index 0000000000..cb0cdc4610
--- /dev/null
+++ 
b/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesDataTest.java
@@ -0,0 +1,175 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hop.pipeline.transforms.getfilenames;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.Test;
+
+/** Test class for GetFileNamesData */
+class GetFileNamesDataTest {
+
+  @Test
+  void testDefaultConstructor() {
+    GetFileNamesData data = new GetFileNamesData();
+
+    assertNotNull(data);
+    assertNotNull(data.lineBuffer);
+    assertTrue(data.lineBuffer.isEmpty());
+    assertNull(data.previousRow);
+    assertEquals(0, data.nrRepeats);
+    assertEquals(0, data.nrLinesOnPage);
+    assertNotNull(data.nf);
+    assertNotNull(data.df);
+    assertNotNull(data.dfs);
+    assertNotNull(data.daf);
+    assertNull(data.outputRowMeta);
+    assertNotNull(data.dafs);
+    assertNull(data.files);
+    assertFalse(data.isLastFile);
+    assertNull(data.filename);
+    assertEquals(0, data.filenr);
+    assertEquals(0, data.filessize);
+    assertNull(data.fr);
+    assertNull(data.zi);
+    assertNull(data.isr);
+    assertFalse(data.doneReading);
+    assertEquals(0, data.headerLinesRead);
+    assertEquals(0, data.footerLinesRead);
+    assertEquals(0, data.pageLinesRead);
+    assertFalse(data.doneWithHeader);
+    assertNull(data.dataErrorLineHandler);
+    assertNull(data.filePlayList);
+    assertNull(data.file);
+    assertEquals(0, data.rownr);
+    assertEquals(0, data.totalpreviousfields);
+    assertEquals(-1, data.indexOfFilenameField);
+    assertEquals(-1, data.indexOfWildcardField);
+    assertEquals(-1, data.indexOfExcludeWildcardField);
+    assertNull(data.inputRowMeta);
+    assertNull(data.readrow);
+    assertEquals(0, data.nrTransformFields);
+  }
+
+  @Test
+  void testSetDateFormatLenient() {
+    GetFileNamesData data = new GetFileNamesData();
+
+    // Test setting lenient to true
+    data.setDateFormatLenient(true);
+    assertTrue(data.daf.isLenient());
+
+    // Test setting lenient to false
+    data.setDateFormatLenient(false);
+    assertFalse(data.daf.isLenient());
+  }
+
+  @Test
+  void testFieldAssignments() {
+    GetFileNamesData data = new GetFileNamesData();
+
+    // Test various field assignments
+    data.nrRepeats = 5;
+    data.nrLinesOnPage = 10;
+    data.isLastFile = true;
+    data.filename = "test.txt";
+    data.filenr = 3;
+    data.filessize = 100;
+    data.doneReading = true;
+    data.headerLinesRead = 2;
+    data.footerLinesRead = 1;
+    data.pageLinesRead = 5;
+    data.doneWithHeader = true;
+    data.rownr = 50L;
+    data.totalpreviousfields = 3;
+    data.indexOfFilenameField = 0;
+    data.indexOfWildcardField = 1;
+    data.indexOfExcludeWildcardField = 2;
+    data.nrTransformFields = 5;
+
+    assertEquals(5, data.nrRepeats);
+    assertEquals(10, data.nrLinesOnPage);
+    assertTrue(data.isLastFile);
+    assertEquals("test.txt", data.filename);
+    assertEquals(3, data.filenr);
+    assertEquals(100, data.filessize);
+    assertTrue(data.doneReading);
+    assertEquals(2, data.headerLinesRead);
+    assertEquals(1, data.footerLinesRead);
+    assertEquals(5, data.pageLinesRead);
+    assertTrue(data.doneWithHeader);
+    assertEquals(50L, data.rownr);
+    assertEquals(3, data.totalpreviousfields);
+    assertEquals(0, data.indexOfFilenameField);
+    assertEquals(1, data.indexOfWildcardField);
+    assertEquals(2, data.indexOfExcludeWildcardField);
+    assertEquals(5, data.nrTransformFields);
+  }
+
+  @Test
+  void testLineBufferOperations() {
+    GetFileNamesData data = new GetFileNamesData();
+
+    assertTrue(data.lineBuffer.isEmpty());
+
+    data.lineBuffer.add("line1");
+    data.lineBuffer.add("line2");
+
+    assertEquals(2, data.lineBuffer.size());
+    assertEquals("line1", data.lineBuffer.get(0));
+    assertEquals("line2", data.lineBuffer.get(1));
+
+    data.lineBuffer.clear();
+    assertTrue(data.lineBuffer.isEmpty());
+  }
+
+  @Test
+  void testPreviousRowAssignment() {
+    GetFileNamesData data = new GetFileNamesData();
+
+    assertNull(data.previousRow);
+
+    Object[] row = {"value1", "value2", "value3"};
+    data.previousRow = row;
+
+    assertNotNull(data.previousRow);
+    assertEquals(3, data.previousRow.length);
+    assertEquals("value1", data.previousRow[0]);
+    assertEquals("value2", data.previousRow[1]);
+    assertEquals("value3", data.previousRow[2]);
+  }
+
+  @Test
+  void testReadrowAssignment() {
+    GetFileNamesData data = new GetFileNamesData();
+
+    assertNull(data.readrow);
+
+    Object[] row = {"input1", "input2"};
+    data.readrow = row;
+
+    assertNotNull(data.readrow);
+    assertEquals(2, data.readrow.length);
+    assertEquals("input1", data.readrow[0]);
+    assertEquals("input2", data.readrow[1]);
+  }
+}
diff --git 
a/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesEdgeCasesTest.java
 
b/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesEdgeCasesTest.java
new file mode 100644
index 0000000000..36d038937b
--- /dev/null
+++ 
b/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesEdgeCasesTest.java
@@ -0,0 +1,245 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hop.pipeline.transforms.getfilenames;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.hop.core.HopEnvironment;
+import org.apache.hop.core.exception.HopException;
+import org.apache.hop.core.plugins.PluginRegistry;
+import org.apache.hop.junit.rules.RestoreHopEngineEnvironmentExtension;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+/** Test class for GetFileNames edge cases and error conditions */
+class GetFileNamesEdgeCasesTest {
+
+  @RegisterExtension
+  static RestoreHopEngineEnvironmentExtension env = new 
RestoreHopEngineEnvironmentExtension();
+
+  private GetFileNamesMeta meta;
+
+  @BeforeEach
+  void setUp() throws HopException {
+    HopEnvironment.init();
+    PluginRegistry.init();
+    meta = new GetFileNamesMeta();
+  }
+
+  @Test
+  void testFileItemWithNullValues() {
+    FileItem fileItem = new FileItem(null, null, null, null, null);
+
+    assertNull(fileItem.getFileName());
+    assertNull(fileItem.getFileMask());
+    assertNull(fileItem.getExcludeFileMask());
+    assertEquals("N", fileItem.getFileRequired());
+    assertEquals("N", fileItem.getIncludeSubFolders());
+  }
+
+  @Test
+  void testFileItemWithEmptyStrings() {
+    FileItem fileItem = new FileItem("", "", "", "", "");
+
+    assertEquals("", fileItem.getFileName());
+    assertEquals("", fileItem.getFileMask());
+    assertEquals("", fileItem.getExcludeFileMask());
+    assertEquals("N", fileItem.getFileRequired());
+    assertEquals("N", fileItem.getIncludeSubFolders());
+  }
+
+  @Test
+  void testFileItemEqualityWithNulls() {
+    FileItem fileItem1 = new FileItem("test.txt", null, null, "Y", "N");
+    FileItem fileItem2 = new FileItem("test.txt", null, null, "Y", "N");
+    FileItem fileItem3 = new FileItem("test.txt", "*.txt", null, "Y", "N");
+
+    assertEquals(fileItem1, fileItem2);
+    assertNotEquals(fileItem1, fileItem3);
+  }
+
+  @Test
+  void testFilterItemWithNullValue() {
+    FilterItem filterItem = new FilterItem(null);
+
+    assertNull(filterItem.getFileTypeFilterSelection());
+    assertEquals(new FilterItem(null), filterItem);
+    assertEquals(filterItem.hashCode(), new FilterItem(null).hashCode());
+  }
+
+  @Test
+  void testFilterItemWithEmptyString() {
+    FilterItem filterItem = new FilterItem("");
+
+    assertEquals("", filterItem.getFileTypeFilterSelection());
+    assertEquals(new FilterItem(""), filterItem);
+    assertEquals(filterItem.hashCode(), new FilterItem("").hashCode());
+  }
+
+  @Test
+  void testGetFileNamesMetaWithEmptyLists() {
+    meta.setFilesList(new ArrayList<>());
+    meta.setFilterItemList(new ArrayList<>());
+
+    assertTrue(meta.getFilesList().isEmpty());
+    assertTrue(meta.getFilterItemList().isEmpty());
+  }
+
+  @Test
+  void testGetFileNamesMetaWithNullLists() {
+    meta.setFilesList(null);
+    meta.setFilterItemList(null);
+
+    assertNull(meta.getFilesList());
+    assertNull(meta.getFilterItemList());
+  }
+
+  @Test
+  void testGetFileNamesMetaWithLargeLists() {
+    List<FileItem> largeFileList = new ArrayList<>();
+    List<FilterItem> largeFilterList = new ArrayList<>();
+
+    for (int i = 0; i < 1000; i++) {
+      largeFileList.add(new FileItem("file" + i + ".txt", "*.txt", "*.tmp", 
"Y", "N"));
+      largeFilterList.add(new FilterItem("FILES_ONLY"));
+    }
+
+    meta.setFilesList(largeFileList);
+    meta.setFilterItemList(largeFilterList);
+
+    assertEquals(1000, meta.getFilesList().size());
+    assertEquals(1000, meta.getFilterItemList().size());
+  }
+
+  @Test
+  void testGetFileNamesMetaWithSpecialCharacters() {
+    String specialFileName = "file with spaces & symbols!@#$%^&*().txt";
+    String specialMask = "*.txt";
+    String specialExclude = "*.tmp";
+
+    FileItem fileItem = new FileItem(specialFileName, specialMask, 
specialExclude, "Y", "N");
+
+    assertEquals(specialFileName, fileItem.getFileName());
+    assertEquals(specialMask, fileItem.getFileMask());
+    assertEquals(specialExclude, fileItem.getExcludeFileMask());
+  }
+
+  @Test
+  void testGetFileNamesMetaWithUnicodeCharacters() {
+    String unicodeFileName = "файл_中文_한글.txt";
+    String unicodeMask = "*.txt";
+
+    FileItem fileItem = new FileItem(unicodeFileName, unicodeMask, "*.tmp", 
"Y", "N");
+
+    assertEquals(unicodeFileName, fileItem.getFileName());
+    assertEquals(unicodeMask, fileItem.getFileMask());
+  }
+
+  @Test
+  void testGetFileNamesMetaWithVeryLongStrings() {
+    String veryLongString = "a".repeat(1000);
+
+    FileItem fileItem = new FileItem(veryLongString, veryLongString, 
veryLongString, "Y", "N");
+
+    assertEquals(veryLongString, fileItem.getFileName());
+    assertEquals(veryLongString, fileItem.getFileMask());
+    assertEquals(veryLongString, fileItem.getExcludeFileMask());
+  }
+
+  @Test
+  void testGetFileNamesMetaWithNegativeRowLimit() {
+    meta.setRowLimit(-100);
+    assertEquals(-100, meta.getRowLimit());
+  }
+
+  @Test
+  void testGetFileNamesMetaWithMaxLongRowLimit() {
+    meta.setRowLimit(Long.MAX_VALUE);
+    assertEquals(Long.MAX_VALUE, meta.getRowLimit());
+  }
+
+  @Test
+  void testGetFileNamesMetaWithZeroRowLimit() {
+    meta.setRowLimit(0);
+    assertEquals(0, meta.getRowLimit());
+  }
+
+  @Test
+  void testGetFileNamesMetaWithAllBooleanCombinations() {
+    // Test all possible combinations of boolean flags
+    boolean[] flags = {true, false};
+
+    for (boolean includeRowNumber : flags) {
+      for (boolean fileField : flags) {
+        for (boolean dynamicIncludeSubFolders : flags) {
+          for (boolean addResultFile : flags) {
+            for (boolean doNotFailIfNoFile : flags) {
+              for (boolean raiseAnExceptionIfNoFile : flags) {
+                meta.setIncludeRowNumber(includeRowNumber);
+                meta.setFileField(fileField);
+                meta.setDynamicIncludeSubFolders(dynamicIncludeSubFolders);
+                meta.setAddResultFile(addResultFile);
+                meta.setDoNotFailIfNoFile(doNotFailIfNoFile);
+                meta.setRaiseAnExceptionIfNoFile(raiseAnExceptionIfNoFile);
+
+                assertEquals(includeRowNumber, meta.isIncludeRowNumber());
+                assertEquals(fileField, meta.isFileField());
+                assertEquals(dynamicIncludeSubFolders, 
meta.isDynamicIncludeSubFolders());
+                assertEquals(addResultFile, meta.isAddResultFile());
+                assertEquals(doNotFailIfNoFile, meta.isDoNotFailIfNoFile());
+                assertEquals(raiseAnExceptionIfNoFile, 
meta.isRaiseAnExceptionIfNoFile());
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  @Test
+  void testGetFileNamesMetaWithEmptyStringFields() {
+    meta.setRowNumberField("");
+    meta.setDynamicFilenameField("");
+    meta.setDynamicWildcardField("");
+    meta.setDynamicExcludeWildcardField("");
+
+    assertEquals("", meta.getRowNumberField());
+    assertEquals("", meta.getDynamicFilenameField());
+    assertEquals("", meta.getDynamicWildcardField());
+    assertEquals("", meta.getDynamicExcludeWildcardField());
+  }
+
+  @Test
+  void testGetFileNamesMetaWithNullStringFields() {
+    meta.setRowNumberField(null);
+    meta.setDynamicFilenameField(null);
+    meta.setDynamicWildcardField(null);
+    meta.setDynamicExcludeWildcardField(null);
+
+    assertNull(meta.getRowNumberField());
+    assertNull(meta.getDynamicFilenameField());
+    assertNull(meta.getDynamicWildcardField());
+    assertNull(meta.getDynamicExcludeWildcardField());
+  }
+}
diff --git 
a/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesMetaAdditionalTest.java
 
b/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesMetaAdditionalTest.java
new file mode 100644
index 0000000000..f0045457e1
--- /dev/null
+++ 
b/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesMetaAdditionalTest.java
@@ -0,0 +1,229 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hop.pipeline.transforms.getfilenames;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.hop.core.HopEnvironment;
+import org.apache.hop.core.exception.HopException;
+import org.apache.hop.core.plugins.PluginRegistry;
+import org.apache.hop.junit.rules.RestoreHopEngineEnvironmentExtension;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+/** Additional test class for GetFileNamesMeta */
+class GetFileNamesMetaAdditionalTest {
+
+  @RegisterExtension
+  static RestoreHopEngineEnvironmentExtension env = new 
RestoreHopEngineEnvironmentExtension();
+
+  private GetFileNamesMeta meta;
+
+  @BeforeEach
+  void setUp() throws HopException {
+    HopEnvironment.init();
+    PluginRegistry.init();
+    meta = new GetFileNamesMeta();
+  }
+
+  @Test
+  void testDefaultConstructor() {
+    assertNotNull(meta);
+    assertNotNull(meta.getFilesList());
+    assertNotNull(meta.getFilterItemList());
+    assertTrue(meta.getFilesList().isEmpty());
+    assertTrue(meta.getFilterItemList().isEmpty());
+  }
+
+  @Test
+  void testSetDefault() {
+    meta.setDefault();
+
+    assertFalse(meta.isDoNotFailIfNoFile());
+    assertTrue(meta.isAddResultFile());
+    assertFalse(meta.isFileField());
+    assertFalse(meta.isIncludeRowNumber());
+    assertEquals("", meta.getRowNumberField());
+    assertEquals("", meta.getDynamicFilenameField());
+    assertEquals("", meta.getDynamicWildcardField());
+    assertFalse(meta.isDynamicIncludeSubFolders());
+    assertEquals("", meta.getDynamicExcludeWildcardField());
+    assertFalse(meta.isRaiseAnExceptionIfNoFile());
+    assertEquals(0, meta.getRowLimit());
+
+    // Check that default filter item is added
+    assertEquals(1, meta.getFilterItemList().size());
+    assertEquals("all_files", 
meta.getFilterItemList().get(0).getFileTypeFilterSelection());
+  }
+
+  @Test
+  void testClone() {
+    meta.setIncludeRowNumber(true);
+    meta.setRowNumberField("rowNum");
+    meta.setFileField(true);
+    meta.setDynamicFilenameField("filename");
+    meta.setDynamicWildcardField("wildcard");
+    meta.setDynamicExcludeWildcardField("exclude");
+    meta.setDynamicIncludeSubFolders(true);
+    meta.setAddResultFile(false);
+    meta.setDoNotFailIfNoFile(true);
+    meta.setRaiseAnExceptionIfNoFile(true);
+    meta.setRowLimit(100);
+
+    GetFileNamesMeta cloned = (GetFileNamesMeta) meta.clone();
+
+    assertNotSame(meta, cloned);
+    assertEquals(meta.isIncludeRowNumber(), cloned.isIncludeRowNumber());
+    assertEquals(meta.getRowNumberField(), cloned.getRowNumberField());
+    assertEquals(meta.isFileField(), cloned.isFileField());
+    assertEquals(meta.getDynamicFilenameField(), 
cloned.getDynamicFilenameField());
+    assertEquals(meta.getDynamicWildcardField(), 
cloned.getDynamicWildcardField());
+    assertEquals(meta.getDynamicExcludeWildcardField(), 
cloned.getDynamicExcludeWildcardField());
+    assertEquals(meta.isDynamicIncludeSubFolders(), 
cloned.isDynamicIncludeSubFolders());
+    assertEquals(meta.isAddResultFile(), cloned.isAddResultFile());
+    assertEquals(meta.isDoNotFailIfNoFile(), cloned.isDoNotFailIfNoFile());
+    assertEquals(meta.isRaiseAnExceptionIfNoFile(), 
cloned.isRaiseAnExceptionIfNoFile());
+    assertEquals(meta.getRowLimit(), cloned.getRowLimit());
+  }
+
+  @Test
+  void testGetRequiredFilesDesc() {
+    assertEquals("N", meta.getRequiredFilesDesc(null));
+    assertEquals("N", meta.getRequiredFilesDesc("N"));
+    assertEquals("Y", meta.getRequiredFilesDesc("Y"));
+    assertEquals("N", meta.getRequiredFilesDesc("invalid"));
+  }
+
+  @Test
+  void testFilesListOperations() {
+    List<FileItem> filesList = new ArrayList<>();
+    filesList.add(new FileItem("file1.txt", "*.txt", "*.tmp", "Y", "N"));
+    filesList.add(new FileItem("file2.txt", "*.txt", "*.tmp", "N", "Y"));
+
+    meta.setFilesList(filesList);
+
+    assertEquals(2, meta.getFilesList().size());
+    assertEquals("file1.txt", meta.getFilesList().get(0).getFileName());
+    assertEquals("file2.txt", meta.getFilesList().get(1).getFileName());
+  }
+
+  @Test
+  void testFilterItemListOperations() {
+    List<FilterItem> filterList = new ArrayList<>();
+    filterList.add(new FilterItem("FILES_ONLY"));
+    filterList.add(new FilterItem("FILES_AND_FOLDERS"));
+
+    meta.setFilterItemList(filterList);
+
+    assertEquals(2, meta.getFilterItemList().size());
+    assertEquals("FILES_ONLY", 
meta.getFilterItemList().get(0).getFileTypeFilterSelection());
+    assertEquals("FILES_AND_FOLDERS", 
meta.getFilterItemList().get(1).getFileTypeFilterSelection());
+  }
+
+  @Test
+  void testBooleanSettersAndGetters() {
+    // Test includeRowNumber
+    meta.setIncludeRowNumber(true);
+    assertTrue(meta.isIncludeRowNumber());
+    meta.setIncludeRowNumber(false);
+    assertFalse(meta.isIncludeRowNumber());
+
+    // Test fileField
+    meta.setFileField(true);
+    assertTrue(meta.isFileField());
+    meta.setFileField(false);
+    assertFalse(meta.isFileField());
+
+    // Test dynamicIncludeSubFolders
+    meta.setDynamicIncludeSubFolders(true);
+    assertTrue(meta.isDynamicIncludeSubFolders());
+    meta.setDynamicIncludeSubFolders(false);
+    assertFalse(meta.isDynamicIncludeSubFolders());
+
+    // Test addResultFile
+    meta.setAddResultFile(true);
+    assertTrue(meta.isAddResultFile());
+    meta.setAddResultFile(false);
+    assertFalse(meta.isAddResultFile());
+
+    // Test doNotFailIfNoFile
+    meta.setDoNotFailIfNoFile(true);
+    assertTrue(meta.isDoNotFailIfNoFile());
+    meta.setDoNotFailIfNoFile(false);
+    assertFalse(meta.isDoNotFailIfNoFile());
+
+    // Test raiseAnExceptionIfNoFile
+    meta.setRaiseAnExceptionIfNoFile(true);
+    assertTrue(meta.isRaiseAnExceptionIfNoFile());
+    meta.setRaiseAnExceptionIfNoFile(false);
+    assertFalse(meta.isRaiseAnExceptionIfNoFile());
+  }
+
+  @Test
+  void testStringSettersAndGetters() {
+    // Test rowNumberField
+    meta.setRowNumberField("rowNum");
+    assertEquals("rowNum", meta.getRowNumberField());
+
+    // Test dynamicFilenameField
+    meta.setDynamicFilenameField("filename");
+    assertEquals("filename", meta.getDynamicFilenameField());
+
+    // Test dynamicWildcardField
+    meta.setDynamicWildcardField("wildcard");
+    assertEquals("wildcard", meta.getDynamicWildcardField());
+
+    // Test dynamicExcludeWildcardField
+    meta.setDynamicExcludeWildcardField("exclude");
+    assertEquals("exclude", meta.getDynamicExcludeWildcardField());
+  }
+
+  @Test
+  void stRowLimit() {
+    meta.setRowLimit(100);
+    assertEquals(100, meta.getRowLimit());
+
+    meta.setRowLimit(0);
+    assertEquals(0, meta.getRowLimit());
+
+    meta.setRowLimit(-1);
+    assertEquals(-1, meta.getRowLimit());
+  }
+
+  @Test
+  void testSupportsErrorHandling() {
+    assertTrue(meta.supportsErrorHandling());
+  }
+
+  @Test
+  void testConstants() {
+    assertNotNull(GetFileNamesMeta.RequiredFilesDesc);
+    assertNotNull(GetFileNamesMeta.RequiredFilesCode);
+    assertEquals(2, GetFileNamesMeta.RequiredFilesDesc.length);
+    assertEquals(2, GetFileNamesMeta.RequiredFilesCode.length);
+    assertEquals("N", GetFileNamesMeta.RequiredFilesCode[0]);
+    assertEquals("Y", GetFileNamesMeta.RequiredFilesCode[1]);
+  }
+}
diff --git 
a/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesMetaTest.java
 
b/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesMetaTest.java
index 18b2f24071..55d6f56594 100644
--- 
a/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesMetaTest.java
+++ 
b/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesMetaTest.java
@@ -116,12 +116,12 @@ class GetFileNamesMetaTest implements 
IInitializer<ITransformMeta> {
 
     validatorFactory.registerValidator(
         validatorFactory.getName(FileItem.class),
-        new ObjectValidator<FileItem>(
+        new ObjectValidator<>(
             validatorFactory,
             FileItem.class,
             Arrays.asList(
                 "name", "filemask", "exclude_filemask", "file_required", 
"include_subfolders"),
-            new HashMap<String, String>() {
+            new HashMap<>() {
               {
                 put("name", "getFileName");
                 put("filemask", "getFileMask");
@@ -130,7 +130,7 @@ class GetFileNamesMetaTest implements 
IInitializer<ITransformMeta> {
                 put("include_subfolders", "getIncludeSubFolders");
               }
             },
-            new HashMap<String, String>() {
+            new HashMap<>() {
               {
                 put("name", "setFileName");
                 put("filemask", "setFileMask");
@@ -142,20 +142,20 @@ class GetFileNamesMetaTest implements 
IInitializer<ITransformMeta> {
 
     validatorFactory.registerValidator(
         validatorFactory.getName(List.class, FileItem.class),
-        new ListLoadSaveValidator<FileItem>(new FileItemLoadSaveValidator()));
+        new ListLoadSaveValidator<>(new FileItemLoadSaveValidator()));
 
     validatorFactory.registerValidator(
         validatorFactory.getName(FilterItem.class),
-        new ObjectValidator<FilterItem>(
+        new ObjectValidator<>(
             validatorFactory,
             FilterItem.class,
             Arrays.asList("filterfiletype"),
-            new HashMap<String, String>() {
+            new HashMap<>() {
               {
                 put("filterfiletype", "getFileTypeFilterSelection");
               }
             },
-            new HashMap<String, String>() {
+            new HashMap<>() {
               {
                 put("filterfiletype", "setFileTypeFilterSelection");
               }
@@ -163,7 +163,7 @@ class GetFileNamesMetaTest implements 
IInitializer<ITransformMeta> {
 
     validatorFactory.registerValidator(
         validatorFactory.getName(List.class, FilterItem.class),
-        new ListLoadSaveValidator<FilterItem>(new 
FilterItemLoadSaveValidator()));
+        new ListLoadSaveValidator<>(new FilterItemLoadSaveValidator()));
   }
 
   @Test
@@ -198,7 +198,7 @@ class GetFileNamesMetaTest implements 
IInitializer<ITransformMeta> {
     }
   }
 
-  public class FilterItemLoadSaveValidator implements 
IFieldLoadSaveValidator<FilterItem> {
+  public static class FilterItemLoadSaveValidator implements 
IFieldLoadSaveValidator<FilterItem> {
     final Random rand = new Random();
 
     @Override
@@ -220,7 +220,7 @@ class GetFileNamesMetaTest implements 
IInitializer<ITransformMeta> {
     }
   }
 
-  public class FileItemLoadSaveValidator implements 
IFieldLoadSaveValidator<FileItem> {
+  public static class FileItemLoadSaveValidator implements 
IFieldLoadSaveValidator<FileItem> {
     final Random rand = new Random();
 
     @Override
diff --git 
a/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesTransformTest.java
 
b/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesTransformTest.java
new file mode 100644
index 0000000000..f404a4086a
--- /dev/null
+++ 
b/plugins/transforms/getfilenames/src/test/java/org/apache/hop/pipeline/transforms/getfilenames/GetFileNamesTransformTest.java
@@ -0,0 +1,239 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hop.pipeline.transforms.getfilenames;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import org.apache.hop.core.HopEnvironment;
+import org.apache.hop.core.exception.HopException;
+import org.apache.hop.core.fileinput.FileInputList;
+import org.apache.hop.core.logging.ILoggingObject;
+import org.apache.hop.junit.rules.RestoreHopEngineEnvironmentExtension;
+import org.apache.hop.pipeline.transforms.mock.TransformMockHelper;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+/** Test class for GetFileNames transform */
+class GetFileNamesTransformTest {
+
+  @RegisterExtension
+  static RestoreHopEngineEnvironmentExtension env = new 
RestoreHopEngineEnvironmentExtension();
+
+  private TransformMockHelper<GetFileNamesMeta, GetFileNamesData> mockHelper;
+
+  @BeforeEach
+  void setUp() throws HopException {
+    HopEnvironment.init();
+
+    mockHelper =
+        new TransformMockHelper<>("GetFileNames", GetFileNamesMeta.class, 
GetFileNamesData.class);
+    when(mockHelper.logChannelFactory.create(any(), any(ILoggingObject.class)))
+        .thenReturn(mockHelper.iLogChannel);
+    when(mockHelper.pipeline.isRunning()).thenReturn(true);
+  }
+
+  @AfterEach
+  void tearDown() {
+    mockHelper.cleanUp();
+  }
+
+  @Test
+  void testConstructor() {
+    GetFileNames transform =
+        new GetFileNames(
+            mockHelper.transformMeta,
+            mockHelper.iTransformMeta,
+            mockHelper.iTransformData,
+            0,
+            mockHelper.pipelineMeta,
+            mockHelper.pipeline);
+
+    assertNotNull(transform);
+    assertEquals(mockHelper.transformMeta, transform.getTransformMeta());
+    assertEquals(mockHelper.iTransformMeta, transform.getMeta());
+    assertEquals(mockHelper.iTransformData, transform.getData());
+    assertEquals(0, transform.getCopyNr());
+    assertEquals(mockHelper.pipelineMeta, transform.getPipelineMeta());
+    assertEquals(mockHelper.pipeline, transform.getPipeline());
+  }
+
+  @Test
+  void testInitWithFileFieldFalse() {
+    // Setup meta for non-file field mode
+    GetFileNamesMeta meta = new GetFileNamesMeta();
+    meta.setFileField(false);
+    meta.setDefault();
+
+    // Add a file item to the list
+    meta.getFilesList().add(new FileItem("/tmp/test.txt", "*.txt", "*.tmp", 
"Y", "N"));
+
+    GetFileNamesData data = new GetFileNamesData();
+
+    GetFileNames transform =
+        new GetFileNames(
+            mockHelper.transformMeta, meta, data, 0, mockHelper.pipelineMeta, 
mockHelper.pipeline);
+
+    // Mock the file list creation
+    FileInputList mockFileList = mock(FileInputList.class);
+    when(mockFileList.nrOfFiles()).thenReturn(1);
+    when(mockFileList.getNonExistentFiles()).thenReturn(new ArrayList<>());
+    when(mockFileList.getNonAccessibleFiles()).thenReturn(new ArrayList<>());
+
+    GetFileNames spyTransform = spy(transform);
+    // Mock the meta.getFileList method instead
+    GetFileNamesMeta spyMeta = spy(meta);
+    doReturn(mockFileList).when(spyMeta).getFileList(any());
+
+    boolean result = spyTransform.init();
+
+    assertTrue(result);
+    assertNotNull(data.outputRowMeta);
+    assertTrue(data.nrTransformFields > 0);
+  }
+
+  @Test
+  void testInitWithFileFieldTrue() {
+    // Setup meta for file field mode
+    GetFileNamesMeta meta = new GetFileNamesMeta();
+    meta.setFileField(true);
+    meta.setDefault();
+    meta.setDynamicFilenameField("filename");
+
+    GetFileNamesData data = new GetFileNamesData();
+
+    GetFileNames transform =
+        new GetFileNames(
+            mockHelper.transformMeta, meta, data, 0, mockHelper.pipelineMeta, 
mockHelper.pipeline);
+
+    boolean result = transform.init();
+
+    assertTrue(result);
+    assertNotNull(data.outputRowMeta);
+    assertEquals(0, data.filessize);
+  }
+
+  @Test
+  void testProcessRowWithNoInput() throws HopException {
+    // Setup
+    GetFileNamesMeta meta = new GetFileNamesMeta();
+    meta.setFileField(false);
+    meta.setDefault();
+
+    GetFileNamesData data = new GetFileNamesData();
+    data.filessize = 0;
+
+    GetFileNames transform =
+        new GetFileNames(
+            mockHelper.transformMeta, meta, data, 0, mockHelper.pipelineMeta, 
mockHelper.pipeline);
+
+    // Add empty row set (no rows)
+    transform.addRowSetToInputRowSets(mockHelper.getMockInputRowSet());
+
+    // Execute
+    boolean result = transform.processRow();
+
+    // Verify
+    assertFalse(result); // Should return false when no more input
+  }
+
+  @Test
+  void testDispose() {
+    GetFileNamesMeta meta = new GetFileNamesMeta();
+    GetFileNamesData data = new GetFileNamesData();
+
+    GetFileNames transform =
+        new GetFileNames(
+            mockHelper.transformMeta, meta, data, 0, mockHelper.pipelineMeta, 
mockHelper.pipeline);
+
+    // Test dispose with null file
+    transform.dispose();
+    // Should not throw exception
+
+    // Test dispose with mock file
+    data.file = mock(org.apache.commons.vfs2.FileObject.class);
+    transform.dispose();
+    // Should not throw exception
+  }
+
+  @Test
+  void testBuildEmptyRow() {
+    GetFileNamesMeta meta = new GetFileNamesMeta();
+    GetFileNamesData data = new GetFileNamesData();
+    data.outputRowMeta = new org.apache.hop.core.row.RowMeta();
+    data.outputRowMeta.addValueMeta(new 
org.apache.hop.core.row.value.ValueMetaString("field1"));
+    data.outputRowMeta.addValueMeta(new 
org.apache.hop.core.row.value.ValueMetaString("field2"));
+
+    GetFileNames transform =
+        new GetFileNames(
+            mockHelper.transformMeta, meta, data, 0, mockHelper.pipelineMeta, 
mockHelper.pipeline);
+
+    // Use reflection to access private method
+    try {
+      java.lang.reflect.Method method = 
GetFileNames.class.getDeclaredMethod("buildEmptyRow");
+      method.setAccessible(true);
+      Object[] row = (Object[]) method.invoke(transform);
+
+      assertNotNull(row);
+      // The output row meta has more fields than just the 2 we added due to 
the transform's default
+      // fields
+      assertTrue(row.length >= 2);
+      assertNull(row[0]);
+      assertNull(row[1]);
+    } catch (Exception e) {
+      fail("Failed to access buildEmptyRow method: " + e.getMessage());
+    }
+  }
+
+  @Test
+  void testConstants() {
+    // Use reflection to access private constants
+    try {
+      java.lang.reflect.Field field1 = 
GetFileNames.class.getDeclaredField("CONST_LOG_NO_FILE");
+      field1.setAccessible(true);
+      String constLogNoFile = (String) field1.get(null);
+      assertEquals("GetFileNames.Log.NoFile", constLogNoFile);
+
+      java.lang.reflect.Field field2 =
+          GetFileNames.class.getDeclaredField("CONST_ERROR_FINDING_FIELD");
+      field2.setAccessible(true);
+      String constErrorFindingField = (String) field2.get(null);
+      assertEquals("GetFileNames.Log.ErrorFindingField", 
constErrorFindingField);
+
+      java.lang.reflect.Field field3 =
+          GetFileNames.class.getDeclaredField("CONST_COULD_NOT_FIND_FIELD");
+      field3.setAccessible(true);
+      String constCouldNotFindField = (String) field3.get(null);
+      assertEquals("GetFileNames.Exception.CouldnotFindField", 
constCouldNotFindField);
+    } catch (Exception e) {
+      fail("Failed to access constants: " + e.getMessage());
+    }
+  }
+}

Reply via email to